视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
word文档该要怎样才能排版 jpeg怎么转换成jpg格式的图片 如何打开ink文件 如何分音节 生辰八字测算自己命硬不硬 正常人体血液细胞各占多少 cf赏金令500级多少赏金币 苹果11屏幕卡了怎么强制关机 李清照是一个怎样的人 考研英语满分多少 国际关系学院是一本吗 飞车怎么侧身飘 qq删除历史头像怎样操作 怎么变白 微信怎么把消息发给多人 京东的白条支付怎么开通 ppt怎么画任意图形 时代精神的核心是什么精神 怎么看朋友添加我的方式 正常人每年献血多少 那拉提草原在新疆什么地方 cdytn00什么型号 苹果11不用原装充电器对手机有影响吗 一只股票放十年会涨吗 卡西欧手表snz什么意思 早恋的定义 手机越充电越少怎么办 七龙珠人造人有哪些 抖音为什么不允许加入粉丝团 物业归哪个部门管理 孩子在幼儿园被同学欺负怎么办 关于五代十国历史的书有哪些 抖音评论里点赞又取消对方知道吗 怎么单独设置一页为横向 该如何修改图片上面的文字 稻城亚丁是属于哪里 word如何将下划线对齐 word怎么删除部分页眉 库乐队怎么样设置苹果铃声 为什么吴邪能进张家古楼
java cipher
2022-08-04 17:47:22 责编:小采
文档
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java cipher是什么,让我们一起了解一下?

cipher是在javax.crypto包下,构成了Java Cryptographic Extension (JCE) 框架的核心,Java的Cipher类提供了加密和解密的功能。

我们都知道,Cipher类是一个引擎类,它需要通过getInstance()工厂方法来实例化对象。那么该如何操作?

1、我们可以通过指定转换模式的方式获得实例化对象,方法如下所示:
// 返回实现指定转换的 Cipher对象
public static Cipher getInstance(String transformation)

2、也可以在制定转换模式的同时制定该转换模式的提供者,方法如下所示:
// 返回实现指定转换的 Cipher对象
public static Cipher getInstance(String transformation, Provider provider)
// 返回实现指定转换的 Cipher对象
public static Cipher getInstance(String transformation, String provider)  

注意这里的参数String transformation,通过如下代码示例:

Cipher c = Cipher.getInstance("DES");

上述实例化操作是一种最为简单的实现,并没有考虑DES分组算法的工作模式和填充模式,可通过以下方式对其设定:

Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

参数String transformation的格式是“算法/工作模式/填充模式”,不同的算法支持不同的工作模式以及填充模式。

另外,Java的Cipher类还提供了加密和解密的功能,那么JAVA是如何通过Cipher实现加密与解密的?

实战操作:具体代码如下

package com.bsd.yx;
import java.security.Key;
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.crypto.Cipher;
import com.ibm.model.cxf.Safety;
/**
 * 加密与解密
 * @author tanf
 * @date 2013-11-08
 */
public class EncryptionDecryption {
/**
* 默认密钥
*/
private static String strDefaultKey = "tandaly201124335";
/** 加密工具 */
private static Cipher encryptCipher = null;
/** 解密工具 */
private static Cipher decryptCipher = null;
/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
* 
* @param arrB
*            需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
* 
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
* 
* @param strIn
*            需要转换的字符串
* @return 转换后的byte数组
* @throws Exception
* 
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
/**
* 默认构造方法,使用默认密钥
* 
* @throws Exception
*/
public EncryptionDecryption() throws Exception {
this(strDefaultKey);
}
/**
* 指定密钥构造方法
* 
* @param strKey
*            指定的密钥
* @throws Exception
*/
public EncryptionDecryption(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
* 
* @param arrB
*            需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public static byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
/**
* 加密字符串
* 
* @param strIn
*            需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public static String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}
/**
* 解密字节数组
* 
* @param arrB
*            需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public static byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
/**
* 解密字符串
* 
* @param strIn
*            需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public static String decrypt(String strIn) throws Exception {
try {
return new String(decrypt(hexStr2ByteArr(strIn)));
} catch (Exception e) {
return "";
}
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
* 
* @param arrBTmp
*            构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "ABC");
return key;
}
/**
* 自定义加密
* 
* @param arrBTmp
*           
* @return 生成的密钥
* @throws java.lang.Exception
*/
public static String BPMMD5(String str){
try {
EncryptionDecryption des = new EncryptionDecryption();// 自定义密钥
str= EncryptionDecryption.encrypt(str);
System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
return str;
}
}

以上就是小编今天的分享了,希望可以帮助到大家。

下载本文
显示全文
专题