java– 三重DES解密无效密钥,16字节

java– 三重DES解密无效密钥,16字节,第1张

概述我有一个Android项目,我从我的Web服务获得一个TripleDES加密文本.我需要TripleDES解密.但是,我收到了无效的密钥异常.我的密钥转换为HEX格式,我收到一个错误:W/System.err:java.security.InvalidKeyException:DES密钥太长–应该是8个字节我发现here一个论坛解释说十六进制可能

我有一个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字节所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1098104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存