Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c#和48个字符的密钥解密Java加密的pan号_C#_Encryption - Fatal编程技术网

使用c#和48个字符的密钥解密Java加密的pan号

使用c#和48个字符的密钥解密Java加密的pan号,c#,encryption,C#,Encryption,我得到了一个由第三方加密的卡盘。他们使用java加密pan,使用48个字符的密钥 使用在线工具,我可以得到与他们看到的相同的结果。但在代码中,我得到一条“指定的密钥对于该算法来说不是有效的大小”错误消息 你能告诉我如何回避这个问题吗 下面的代码片段 private void button1_Click(object sender, EventArgs e) { byte[] Results; UTF8Encoding UTF8 = new UTF8

我得到了一个由第三方加密的卡盘。他们使用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);
}
请就如何最好地回避这个问题提出建议


谢谢

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


我怀疑您需要对字符串进行十六进制解码以获取密钥,而不是获取字符串的字节。

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


我怀疑您需要对字符串进行十六进制解码以获取密钥,而不是获取字符串的字节。

感谢您的回复

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


再次感谢您的回复

感谢您的回复

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


再次感谢您的回复

您有加密此文件的java代码吗?我正在从第三方搜索确切的加密方法,但我现在得到的只是使用DESede/ECB/PKCS5PANDING发送给我们需要解密的base64字符串。将在第三方发送方法后发送该方法。谢谢你的建议。现在已经发布了问题中的代码您是否有加密此的java代码?我正在从第三方搜索确切的加密方法,但我现在得到的只是使用DESede/ECB/PKCS5Padding向我们发送base64字符串,我们需要对其进行解密。将在第三方发送方法后发送该方法。谢谢你的建议。现在已经在问题中发布了代码是的,除此之外,
UTF8Encoding.UTF8.GetBytes(key.Text)通常不正确,因为它与随机密钥字节不兼容。请注意,MD5函数根本没有使用,因为它只生成16个字节,所以24字节(48个十六进制字符)的键不太可能需要它。是的,除此之外,
UTF8Encoding.UTF8.GetBytes(key.Text)通常不正确,因为它与随机密钥字节不兼容。请注意,MD5函数根本没有使用,因为它只生成16个字节,所以对于24个字节(48个十六进制字符)的键,不太可能需要它。