[英]Convert from Java to C# - Decrypt CBC-AES-256 with PKCS5Padding
[英]Clickbank CBC-AES-256 decryption in c#
我是這種加密和解密技術的新手。
我正在使用Clickbank 即時通知系統完成一項任務。 我正在從Clickbank獲取加密值,並且想解密該通知。 我的問題與該線程非常相似,但對我不起作用。 它拋出以下錯誤:
指定的初始化向量(IV)與該算法的塊大小不匹配。
下面是我的解密代碼。
protected void Page_Load(object sender, EventArgs e)
{
//Sample response
string sContent = "{\"notification\":\"18XR9s5fwkbhvfriqYS6jDJERf++jshcTDQX4NuUoUHtS+YzfMCNiEvmIVNxkbT5My2xWLFPB9mb\nEjwpHd3A6b9WJDYiXc0nufTxhXDAL1JzyYryEZAq7Bogj7mHjxUfFhc419wDmQteoSEz4H0IsKha\nIoxSfA5znd6WZKCSY9Dxx0wbZ8jLNL8SOYxi7pbFdKgMgKULKEh4EPKaWAvhE5UjWtzuHvMX37NI\nOvApkBoYEDE2mrde/SjLigE38X2wsGB4M6pYVkfzEE6rbYfVNxadkNHmri1xlaa+Grudy6vt6wzq\nPUfroEb6uRlxj2e6dmKZE4kynJFmRosMJ4ZRC+sYW+DyvkbdSY2dl1ZMNPhP+yhcMkbU8HQKUipw\nd7FUpb6utfiDB8YL5z7pJMnjHP01PsIvG+eSj0Lfj1gmbtVJt6TOJ4BCZxZdfdPRlJtPdOUiMRRk\nQ3Wn5g9VuvzNYg2ostZ+/HE778M6lZ264KbpMZSqEj4cTPCGFFNt7VCz9fXVoDLa7oI7KGY6rgxb\nBLWXdX058RSd0gSzC8otkCx9b6p8FZ5XxAX4qbU814batcbxw3V3GGVf97VLSVysdrHc+PEFdocl\nqaRarCHG5e2ZpEgQLoCtRhA99qkuS9Uc9+Hm1KT4kD2HIrPSclJWzUMoKuAG4n95EG0Q5ca0WZQx\naLNhdPyJmSLNwjV/SNPxYdyy81ENZtLbwJOYENCnpd41z73HF91/R1hrxQ0rCZsb6BBRGUeowEzE\nSKPSbWjDCQ6hLZTjObsOt6eTAmn8TrzjyqdwUfxHhLEtIQIOr4gPXxXqwGHYcNkRFezkwMScl2Hr\nmJ+Zm1xCqs9+fOOiO6TtZYKS+9Dl/JevMfGdbcPw8/5F7+ZVAkCcDS8OGaVv\",\"iv\":\"NDVEM0M4ODZGMzE4OTVENA==\"}";
using (var reader = new StreamReader(Request.InputStream))
{
//Using below two lines for live testing
//JavaScriptSerializer js = new JavaScriptSerializer();
//sContent = reader.ReadToEnd();
JObject jObject = JObject.Parse(sContent);
JToken notification = jObject["notification"];
JToken i = jObject["iv"];
using (StreamWriter _testData = new StreamWriter(Server.MapPath("~/data.txt"), true))
{
_testData.WriteLine("=======================Notification"); // Write the file.
_testData.WriteLine(notification.ToString());
_testData.WriteLine("=======================IV"); // Write the file.
_testData.WriteLine(i.ToString());
string n = notification.ToString();
string v = i.ToString();
string sk = "MY SECRET KEY";
byte[] key = Encoding.UTF8.GetBytes(sk);
byte[] iv = Encoding.UTF8.GetBytes(v);
try
{
using (var rijndaelManaged =
new RijndaelManaged { Key = key, IV = iv, Mode = CipherMode.CBC })
using (var memoryStream =
new MemoryStream(Convert.FromBase64String(n)))
using (var cryptoStream =
new CryptoStream(memoryStream,
rijndaelManaged.CreateDecryptor(key, iv),
CryptoStreamMode.Read))
{
var dString = new StreamReader(cryptoStream).ReadToEnd();
}
}
catch (CryptographicException ex)
{
Console.WriteLine("A Cryptographic error occurred: {0}", ex.Message);
}
}
}
}
請讓我知道我錯了嗎?
謝謝
我剛剛敲了敲這個完全相同的問題,所以這是我的解決方案。 要記住的是,密碼短語/密鑰由sha1散列,並且前32個十六進制字符用作密鑰字節。 讓我失望的部分是,這些字符是c#中的UFT16字符,實際上每個字符都是2個字節,但不是源加密所使用的字符。 所以我所做的就是將字符串轉換為具有正確字節數組的ASCII字符串。 不是最干凈的代碼,但是可以正常工作。
public static string DecryptClickBankNotification(string cipherText, string passPhrase, string initVector)
{
string decryptedString = null;
byte[] inputBytes = Encoding.UTF8.GetBytes(passPhrase);
SHA1 sha1 = SHA1.Create();
byte[] key = sha1.ComputeHash(inputBytes);
StringBuilder hex = new StringBuilder(key.Length * 2);
foreach (byte b in key)
hex.AppendFormat("{0:x2}", b);
string secondPhaseKey = hex.ToString().Substring(0,32);
ASCIIEncoding asciiEncoding = new ASCIIEncoding();
byte[] keyBytes = asciiEncoding.GetBytes(secondPhaseKey);
byte[] iv = Convert.FromBase64String(initVector);
try
{
using (RijndaelManaged rijndaelManaged = new RijndaelManaged
{
Key = keyBytes,
IV = iv,
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7})
using (Stream memoryStream = new MemoryStream(Convert.FromBase64String(cipherText)))
using (CryptoStream cryptoStream =
new CryptoStream(memoryStream,
rijndaelManaged.CreateDecryptor(keyBytes, iv),
CryptoStreamMode.Read))
{
decryptedString = new StreamReader(cryptoStream).ReadToEnd();
}
}
catch (Exception ex)
{
Trace.WriteLine(new TraceData(TraceCategoryEnum.Errors, "Error decrypting message: " + ex.Message));
}
return decryptedString;
}
如果您的v有16個字母,並且您是Encoding.UTF8.GetBytes(v);
字節數可能在16到64之間。這可能會給您帶來錯誤。
指定的初始化向量(IV)與該算法的塊大小不匹配。
驗證iv是16個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.