我有一个Android项目,我从我的Web服务获得一个Triple DES加密文本.我需要Triple DES解密.
但是,我收到了无效的密钥异常.我的密钥转换为HEX格式,我收到一个错误:W / System.err:java.security.InvalIDKeyException:DES密钥太长 – 应该是8个字节我发现here一个论坛解释说十六进制可能导致问题
“DES密钥是56位,通常以8个字节打包,所以他们给你的16个字节/字符很可能是密钥的十六进制编码字节.你可以得到一个十六进制解码器”
所以我使用了将十六进制字符串转换为字节数组
private static byte[] hexStringtoByteArray(String hex){ int len = hex.length(); byte [] data = new byte[len/2]; for(int i=0; i<len;i+=2){ data[i/2] = (byte)((Character.digit(hex.charat(i), 16)<<4) + Character.digit(hex.charat(i+1),16)); } return data; }
并将其传递给密码,我收到一个错误:
W/System.err﹕ java.security.InvalIDKeyExceptionW/System.err﹕ at javax.crypto.spec.DESedeKeySpec.
这是我的解密方法.如果有人可以对我可能出错的地方有所了解,我将不胜感激.
public String DesDecryptPin(String pin, String encryptKey) throws NoSuchpaddingException, NoSuchAlgorithmException, InvalIDKeyException, BadpaddingException, IllegalBlockSizeException, UnsupportedEnCodingException { String UNICODE_FORMAT = "UTF8"; String decryptedPinText = null; byte[] hexConvert = hexStringtoByteArray(encryptKey); SecretKey desKey = null; KeySpec desKeySpec = new DESedeKeySpec(hexConvert); // Exception HERE Cipher desCipher; SecretKeyFactory skf = SecretKeyFactory.getInstance("DESede"); desCipher = Cipher.getInstance("DES/ECB/Nopadding"); try { desKey = skf.generateSecret(desKeySpec); } catch (InvalIDKeySpecException e) { e.printstacktrace(); } desCipher.init(Cipher.DECRYPT_MODE, desKey); byte[] decryptPin = desCipher.doFinal(pin.getBytes()); decryptedPinText = new String(decryptPin, "UTF-8"); return decryptedPinText;}
我的关键是C9AF269DF8A78A06D1216BFFF8F0536A.
我已经检查过客户端并且密钥是正确的,因此使用相同的密钥进行加密.
加密代码
public string TripleDESEncrypt(string strClearText, string strKey) { byte[] bytClearText; byte[] bytClearTextChunk = new byte[8]; byte[] bytEncryptedChunk = new byte[8]; int BytesCount = 0; int nArrayposition = 0; string strEncryptedChar; string strEncryptedText = ""; ArrayList input = new ArrayList(); ArrayList Output = new ArrayList(); TripleDESCryptoServiceProvIDer tdes = (TripleDESCryptoServiceProvIDer)TripleDESCryptoServiceProvIDer.Create(); tdes.Key = HexToByteArray(strKey); tdes.Mode = CipherMode.ECB; ICryptotransform tdesEncrypt = tdes.CreateEncryptor(); bytClearText = ASCIIEnCoding.ASCII.GetBytes(strClearText); BytesCount = bytClearText.Length; for (int i = 0; i < BytesCount; i++) { if (nArrayposition == 8) { input.Add(bytClearTextChunk); bytClearTextChunk = new byte[8]; nArrayposition = 0; } bytClearTextChunk[nArrayposition] = bytClearText[i]; nArrayposition++; } if (nArrayposition != 0) input.Add(bytClearTextChunk); foreach (byte[] Cbyte in input) { tdesEncrypt.transformBlock(Cbyte, 0, 8, bytEncryptedChunk, 0); Output.Add(bytEncryptedChunk); bytEncryptedChunk = null; bytEncryptedChunk = new byte[8]; } foreach (byte[] Cbyte in Output) { foreach (byte BByte in Cbyte) { strEncryptedChar = BByte.ToString("X"); strEncryptedChar = strEncryptedChar.Padleft(2, Convert.tochar("0")); strEncryptedText += strEncryptedChar; } } return strEncryptedText; }
以下是具有14个字符的解密文本的示例:12345678901234
解决方法:
DES会期望一个8字节的密钥(带有奇偶校验).所以Triple DES需要24字节密钥(带奇偶校验).由于您只有一个16字节的密钥,因此必须复制其中一些密钥才能获得最终密钥.通常,第一个和最后8个字节是相同的.您可以尝试两种变体:
byte[] tdesKey = new byte[24];System.arraycopy(hexConvert, 0, tdesKey, 0, 16);System.arraycopy(hexConvert, 0, tdesKey, 16, 8);// tdesKey := K1 || K2 || K1
要么
byte[] tdesKey = new byte[24];System.arraycopy(hexConvert, 8, tdesKey, 0, 8);System.arraycopy(hexConvert, 0, tdesKey, 8, 16);// tdesKey := K2 || K1 || K2
什么时候
hexConvert := K1 || K2
总结 以上是内存溢出为你收集整理的java – 三重DES解密无效密钥,16字节全部内容,希望文章能够帮你解决java – 三重DES解密无效密钥,16字节所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)