Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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
3DES-在C中解密加密文本(通过JAVA)#_Java_C# 2.0_3des - Fatal编程技术网

3DES-在C中解密加密文本(通过JAVA)#

3DES-在C中解密加密文本(通过JAVA)#,java,c#-2.0,3des,Java,C# 2.0,3des,情况如下: 加密文本是用JAVA完成的(我们根本没有JAVA背景) 方法为3DES 填充的是PKCS#5 基数64 解密将使用C#,以下是代码: public static string DecryptString(string Message, string Passphrase) { byte[] Results; UTF8Encoding UTF8 = new UTF8Encoding(); MD5CryptoService

情况如下:

  • 加密文本是用JAVA完成的(我们根本没有JAVA背景)
  • 方法为3DES
  • 填充的是PKCS#5
  • 基数64
  • 解密将使用C#,以下是代码:

        public static string DecryptString(string Message, string Passphrase)
        {
            byte[] Results;
            UTF8Encoding UTF8 = new UTF8Encoding();
    
            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
    
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
    
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
    
            byte[] DataToDecrypt = Convert.FromBase64String(Message);
    
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }
    
            return UTF8.GetString(Results);
        }
    
    但是,当尝试解密时,收到错误消息:坏数据

    我在哪里失踪了

    提前谢谢

    添加,以下是加密的工作原理:

    <cffunction name="getToken" returntype="String" output="false">
        <cfscript>
            plainText = getPlainText();
            rawSecretKey = CreateObject("java","sun.misc.BASE64Decoder").decodeBuffer(variables.encryptionKey);
    
            secretKeySpec = CreateObject("java","javax.crypto.spec.SecretKeySpec").init(rawSecretKey,"DESEDE");
    
            cipher = CreateObject("java","javax.crypto.Cipher").getInstance("DESEDE");
            cipher.init(Cipher.ENCRYPT_MODE, secretkeySpec);
    
            encrypted = cipher.doFinal(plainText.getBytes()); // a byte array (a binary in CF)
    
            return URLEncodedFormat(ToString(ToBase64(encrypted)));
        </cfscript>
    </cffunction>
    
    
    明文=获取明文();
    rawSecretKey=CreateObject(“java”,“sun.misc.BASE64Decoder”).decodeBuffer(variables.encryptionKey);
    secretKeySpec=CreateObject(“java”,“javax.crypto.spec.secretKeySpec”).init(rawSecretKey,“DESEDE”);
    cipher=CreateObject(“java”、“javax.crypto.cipher”).getInstance(“DESEDE”);
    cipher.init(cipher.ENCRYPT_模式,secretkeySpec);
    加密=cipher.doFinal(明文.getBytes());//字节数组(CF中的二进制)
    返回URLEncodedFormat(ToString(ToBase64(加密));
    
    更新: 这个问题已经解决了。问题是需要从Base64转换密钥。

    答案是:

    而不是:

    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
    
    这样做:

    byte[] TDESKey = Convert.FromBase64String(Passphrase);
    

    这就解决了这个问题。

    那么,pkcs是5还是7?除此之外,看起来不错。我所做的是在编码过程中的每一步之后打印一个字符串,这允许在解码过程中定位问题。啊,在这种情况下,PKCS#7与#5.Alex兼容,谢谢你的建议。我调试它时,错误发生在这一行:Results=Decryptor.TransformFinalBlock(DataToDecrypt,0,DataToDecrypt.Length)@用户610271:如果你自己已经解决了你的问题,那么就回答并接受它。