从Java转换为C-使用PKCS5P解密CBC-AES-256

从Java转换为C-使用PKCS5P解密CBC-AES-256,java,c#,encryption,clickbank,Java,C#,Encryption,Clickbank,我试图解密ClickBank中的“即时通知”,它们有几种语言的解码代码示例,但没有C语言,因此我试图翻译Java代码: 在过去的几天里,我尝试了几种不同的方法,但是没有成功!请帮忙,我错过了什么 爪哇: C 给出错误-“填充无效,无法删除。” 所以我猜我一定是创建了错误的键,我尝试了不同的散列和十六进制编码方法,但似乎都不管用。请建议大家!谢谢你的时间 编辑:删除无用的额外代码哦,天哪,一家使用CBC发送消息的银行。这个Java代码示例看起来像是我第一次尝试加密,它来自一家银行,您不应该信任这

我试图解密ClickBank中的“即时通知”,它们有几种语言的解码代码示例,但没有C语言,因此我试图翻译Java代码:

在过去的几天里,我尝试了几种不同的方法,但是没有成功!请帮忙,我错过了什么

爪哇:

C

给出错误-“填充无效,无法删除。”

所以我猜我一定是创建了错误的键,我尝试了不同的散列和十六进制编码方法,但似乎都不管用。请建议大家!谢谢你的时间


编辑:删除无用的额外代码

哦,天哪,一家使用CBC发送消息的银行。这个Java代码示例看起来像是我第一次尝试加密,它来自一家银行,您不应该信任这家银行


键确实是错误的,您应该尝试key=Hex.tohextString,然后使用Encoding.ASCII.GetByteskey将结果的子字符串转换为ASCII。Java代码中不存在额外的基64位或位转换,因此不应使用。

您是否设置了断点并检查了密码的十六进制编码后的值?我的怀疑是,这就是事情出错的地方。@Hintham是的,但我不知道它应该是什么样子,它只是随机数。我尝试添加.Replace-,string.Empty,正如这里推荐的那样:但是仍然没有幸运,谢谢Maarten!真是一团糟,不是吗。。。他们不是银行,他们促进联盟营销。我不想使用但必须使用的服务!
final StringBuilder buffer = new StringBuilder();
final String secretKey = "YOUR SECRET KEY";


String line;
final BufferedReader reader = theRequest.getReader();
while(null != (line = reader.readLine())) {
   buffer.append(line);
}


   final JSONParser parser = new JSONParser();
   final JSONObject obj = (JSONObject) parser.parse(buffer.toString()); 

   final String initializationVector = (String) obj.get("iv");
   final String encryptedNotification = (String) obj.get("notification"); 
   final MessageDigest digest = MessageDigest.getInstance("SHA-1");
   digest.reset();
   digest.update(secretKey.getBytes("UTF-8"));
   final String key = new String(Hex.encodeHex(digest.digest())).substring(0, 32);


   final IvParameterSpec iv = new IvParameterSpec(DatatypeConverter.parseBase64Binary(initializationVector));
   final SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
   final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
   cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);

   final JSONObject notification = (JSONObject) parser.parse(
   new String(cipher.doFinal(DatatypeConverter.parseBase64Binary(encryptedNotification)),
                 "ISO-8859-1"));`
        const string secretKey = "YOUR SECRET KEY";
        string sContent = "";
        using (System.IO.Stream receiveStream = Request.InputStream)
        {
            receiveStream.Position = 0;
            using (System.IO.StreamReader readStream =
                   new System.IO.StreamReader(receiveStream, Encoding.UTF8))
            {
                sContent = readStream.ReadToEnd();
            }
        }
        dynamic json = System.Web.Helpers.Json.Decode(sContent);
        string initializationVector = json.iv;
        string encryptedNotification = json.notification;

        //turn the key into a fixed length string via SHA-1 hash
        SHA1 sha1 = SHA1Managed.Create();
        byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(secretKey));
        var key = Org.BouncyCastle.Utilities.Encoders.Hex.Encode(hash);
        var keyString = Convert.ToBase64String(key).Substring(0, 32);
        //var key = BitConverter.ToString(hash).Substring(0, 32);

        var iv = Convert.FromBase64String(initializationVector);
        byte[] keyspec = Encoding.UTF8.GetBytes(keyString);

         using (var rijndaelManaged =
               new RijndaelManaged { Key = keyspec, IV = iv, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 })
        using (var memoryStream =
               new MemoryStream(Convert.FromBase64String(encryptedNotification)))
        using (var cryptoStream =
               new CryptoStream(memoryStream,
                   rijndaelManaged.CreateDecryptor(keyspec, iv),
                   CryptoStreamMode.Read))
        {
            var result = new StreamReader(cryptoStream).ReadToEnd();
        }