使用c#使用48个字符的密钥解密在Java中加密的摇号

本文关键字:使用 加密 Java 解密 48个 字符 密钥 | 更新日期: 2023-09-27 18:24:55

我收到了一个由第三方加密的卡片盘。他们使用java对pan进行了加密,密钥为48个字符。

使用在线工具,我可以得到与他们看到的相同的结果。但在代码中,我得到了一个"指定的密钥不是此算法的有效大小。"错误消息。

你能告诉我如何绕过这个问题吗?

下方的代码段

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] Results;
        UTF8Encoding UTF8 = new UTF8Encoding();
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] TDESKey = UTF8Encoding.UTF8.GetBytes(key.Text);
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        TDESAlgorithm.IV = new byte[TDESAlgorithm.BlockSize / 8];
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        byte[] DataToDecrypt = Convert.FromBase64String(decrypt.Text);
        try
        {
            ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
            Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
        }
        finally
        {
            TDESAlgorithm.Clear();
        }
      decryptedText.Text =  UTF8.GetString(Results);

    }

用于在下加密的代码

public static String encryptData(String toEncrypt, byte[] sharedKeyBytes){
    byte[] encrypted = new byte[0];
    try {
        DESedeKeySpec keySpec = new DESedeKeySpec(sharedKeyBytes);
        SecretKey key = SecretKeyFactory.getInstance(ALGORITHM_DESEDE).generateSecret(keySpec);
        Cipher encrypter = Cipher.getInstance(TRANSFORMSATION_DESEDE_PADDED);
        encrypter.init(Cipher.ENCRYPT_MODE, key);
        byte[] input = toEncrypt.getBytes(UTF_8);
        encrypted = encrypter.doFinal(input);
    } catch (Exception e) {
        throw new CryptoException("Exception caught when encrypting", e);
    }
    return new String(Base64.encodeBase64(encrypted));
}

这是我需要在c#中生成的等价物。该代码在java中工作

public static String decryptTripleDES(String toDecrypt, byte[] customerSharedKeyBytes){
    byte[] decrypted = new byte[0];
    System.out.println(customerSharedKeyBytes.length);
    try {
        byte[] decodedValue = Base64.decodeBase64(toDecrypt.getBytes(UTF_8));
        DESedeKeySpec keySpec = new DESedeKeySpec(customerSharedKeyBytes);
        SecretKey key = SecretKeyFactory.getInstance(ALGORITHM_DESEDE).generateSecret(keySpec);
        Cipher decrypter = Cipher.getInstance(TRANSFORMSATION_DESEDE_PADDED);
        decrypter.init(Cipher.DECRYPT_MODE, key);
        decrypted = decrypter.doFinal(decodedValue);
    } catch (Exception e) {
        throw new CryptoException("Exception caught when decrypting", e);
    }
    return new String(decrypted);
}

请就如何最好地绕过这个问题提出建议。

感谢

使用c#使用48个字符的密钥解密在Java中加密的摇号

三重DES密钥的长度为24字节,即48个十六进制字符。

我怀疑你需要对字符串进行十六进制解码才能获得密钥,而不是获取字符串的字节数。

感谢您的回复,

事实证明,如上所述,3DES密钥需要24字节长。我把密钥的前24个字符转换成密钥字节,并将其分配给3DES密钥。然后这就如预期的那样奏效了。与有点奇怪的c#相比,Java似乎是宽容的。尽管第三方使用48个字符的密钥,但该算法似乎会丢弃Java中前24个字符之外的任何内容,但不会抱怨或抛出运行时错误。

再次感谢您的回复