3des加密数据长度报错
2017-07-04 18:36
127 查看
javax.crypto.IllegalBlockSizeException: error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length
这个报错的原因是要加密的数据长度不是密钥长度的倍数!
修改如下(红色代码加上后就不会报错了):
while (in.length()%16 != 0){ in = in + "0"; }
//3DES加密
public static String TDesEnc(String key, String in){
while (in.length()%16 != 0){
in = in + "0";
}
try {
return bcd2str(TDesEnc(hexStringToByte(key.toUpperCase()), hexStringToByte(in.toUpperCase())));
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
//3DES加密
public static byte[] TDesEnc(byte[] key, byte[] in) throws Exception {
Key deskey = null;
byte[] tdesKey = new byte[24];
if (key.length % 8 != 0)
return null;
if (key.length == 8) {
System.arraycopy(key, 0, tdesKey, 0, 8);
System.arraycopy(key, 0, tdesKey, 8, 8);
System.arraycopy(key, 0, tdesKey, 16, 8);
}
if (key.length == 16) {
System.arraycopy(key, 0, tdesKey, 0, 16);
System.arraycopy(key, 0, tdesKey, 16, 8);
}
DESedeKeySpec spec = new DESedeKeySpec(tdesKey);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(in);
return bOut;
}
这个报错的原因是要加密的数据长度不是密钥长度的倍数!
修改如下(红色代码加上后就不会报错了):
while (in.length()%16 != 0){ in = in + "0"; }
//3DES加密
public static String TDesEnc(String key, String in){
while (in.length()%16 != 0){
in = in + "0";
}
try {
return bcd2str(TDesEnc(hexStringToByte(key.toUpperCase()), hexStringToByte(in.toUpperCase())));
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
//3DES加密
public static byte[] TDesEnc(byte[] key, byte[] in) throws Exception {
Key deskey = null;
byte[] tdesKey = new byte[24];
if (key.length % 8 != 0)
return null;
if (key.length == 8) {
System.arraycopy(key, 0, tdesKey, 0, 8);
System.arraycopy(key, 0, tdesKey, 8, 8);
System.arraycopy(key, 0, tdesKey, 16, 8);
}
if (key.length == 16) {
System.arraycopy(key, 0, tdesKey, 0, 16);
System.arraycopy(key, 0, tdesKey, 16, 8);
}
DESedeKeySpec spec = new DESedeKeySpec(tdesKey);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(in);
return bOut;
}
相关文章推荐
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- 3DES加密,秘钥长度为32
- 探讨.NET Core数据进行3DES加密和解密问题
- mysql的sha1加密的数据长度
- Android数据加密DES、3DES、AES
- PHP版DES算法加密数据(3DES)
- 【数据加密】Java中3DES加密解密调用示例
- 使用3DES加密与解密实习Android端和后台的数据加密传输
- md5() 加密password,数据库字段长度要够(eg:varchar(30)),丢失部分数据,导致登录不上
- Java数据加密时密码的长度限制
- 3DES加密
- J2ME加密数据的一个第三方开源免费类库介绍
- 利用XSL对XML数据进行加密和大小写转换
- [Utility.sln]根据MSDN上的DESCryptoServiceProvider 类 尝试写的对称密钥加密原代码[可应用于安全级别不高的数据连接和密码保护]
- How To:使用DPAPI来加密和解密数据
- [原创]读出数据库数据,控制显示长度!
- [原创][QQ聊天记录]-和“阮”谈有关数据加密(.NET CF数据加密,DSA算法)