Saya perlu mendekripsi gambar yang berasal dari layanan online (yang bukan milik saya, jadi saya harus menggunakan cara enkripsi ini).
Gambar ini dienkripsi menggunakan AES/ECB dengan satu kunci sinkron dan diisi menggunakan PKCS5.
Saya mencoba beberapa cara untuk mencapai hal ini, tetapi tidak ada yang berhasil. Saya menggunakan perpustakaan kriptografi BoucyCastle.
Ini kode dekripsi saya:
public static byte[] Decrypt(string input)
{
var cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");
cipher.Init(false, new KeyParameter(Encoding.UTF8.GetBytes(KEY)));
byte[] todo = Encoding.UTF8.GetBytes(Pad(input));
byte[] bytes = cipher.ProcessBytes(todo);
byte[] final = cipher.DoFinal();
// Write the decrypt bytes & final to memory...
var decryptedStream = new MemoryStream(bytes.Length);
decryptedStream.Write(bytes, 0, bytes.Length);
decryptedStream.Write(final, 0, final.Length);
decryptedStream.Flush();
var decryptedData = new byte[decryptedStream.Length];
decryptedStream.Read(decryptedData, 0, (int)decryptedStream.Length);
return decryptedData;
}
private static string Pad(string data)
{
int len = data.Length;
int toAdd = (16 - len % 16);
for (int i = 0; i < toAdd; i++)
{
data += (char)toAdd;
}
return data;
}
Ketika saya mencobanya, muncul InvalidCipherTextExpression dengan pesan "pad block rusak", di baris byte[] final = cipher.DoFinal();
.
Saya menguji fungsi padding saya dan sepertinya berfungsi seperti yang diharapkan.
Saya mencoba mencari ke dalam kode sumber BouncyCastle untuk mencari kesalahan saya, dan yang saya temukan adalah blok terakhir tidak memiliki padding apa pun, dan itulah yang menyebabkan kesalahan tersebut. Jadi saya bertanya-tanya apakah saya melakukan sesuatu yang salah di tempat lain, karena itu mungkin bukan berasal dari padding.
Mungkin string input, yang diambil dari server http dengan ini :
// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return new StreamReader(response.GetResponseStream()).ReadToEnd();
Apa yang ingin saya capai adalah hal yang persis sama seperti di sini: C# Mendekripsi AES /ECB Paddded Menggunakan PKCS#5
Tapi tidak ada tenda karena penanya tidak mencoba apa pun..
Terima kasih sebelumnya, dan saya benar-benar minta maaf atas bahasa Inggris saya yang buruk.