Tôi đang cố gắng mã hóa dữ liệu của mình bằng thuật toán AES với chế độ CBC. Vì lý do này tôi sử dụng .Net Library 'Bouncy Castle'. Tôi không có nền tảng về mật mã, vì vậy tôi đang cố gắng sử dụng nó một cách đơn giản. Đây là mã mã hóa của tôicách xóa dữ liệu trước khi mã hóa bằng bouncyCastle
public byte[] encrypt(byte[] key, byte[] iv,byte[] data)
{
IBlockCipher engine=new AesFastEngine();
KeyParameter keyParam = new KeyParameter(key);
CbcBlockCipher cipher = new CbcBlockCipher(engine);
ICipherParameters parameters = new ParametersWithIV(keyParam, iv);
byte[] output=new byte[16+data.Length];
cipher.Init(true, parameters);
cipher.ProcessBlock(data, 0, output, data.Length);
//process output
byte[] cipherArray = new byte[data.Length];
/*
int k=0;
for (int i = 0; i < output.Length; i++)
{
if (output[i]!= 0)
{
cipherArray[k++] = output[i];
}
}
*/
return cipherArray;
}
Khi tôi thử đầu vào không phải là bội số 16, tôi có ngoại lệ. Khi tôi pad mảng bên phải với một số (16-length% 16) với số không ở bên trái, tôi có thể nhận được kết quả. Nhưng kết quả là một vấn đề đối với tôi. Nó mang lại cho tôi kết quả như sau:
[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0]
số 0 ở cả bên trái và bên phải.
Tôi nghĩ có thể là do tôi sử dụng chức năng ProcessBlock(data, 0, output, data.Length)
. Tôi sử dụng nó với giả định rằng đầu ra sẽ là văn bản được mã hóa của tôi, nhưng có vẻ như đầu ra phải dài hơn độ dài đầu vào. vì tôi không có tài liệu về chức năng này, tôi có thể đang sử dụng nó theo cách sai. Mọi trợ giúp sẽ là ứng dụng
cảm ơn bạn jbtule, nhưng tôi có một vấn đề với patter này khi tôi cố gắng sử dụng paddedCipher.DoFinal (đầu ra, len); nó ném một ngoại lệ "khối cuối cùng không đầy đủ trong decription", processBytes phương pháp trả về một giá trị đó là một phép nhân của 16 đó là nhỏ hơn chiều dài dữ liệu, bạn sẽ biết những gì gây ra vấn đề này? cảm ơn – ikbal
@paskalnikov Tôi đã thêm nhiều mã hơn để hiển thị cách sử dụng.'ProcessBytes' sẽ xuất byte cho mỗi khối hoàn chỉnh và giữ phần còn lại đệm (bạn cũng có thể gọi 'ProcessBytes' nhiều lần bạn muốn cho nó một phần dữ liệu cùng một lúc), nó sẽ không giả sử bạn đã hoàn thành cho đến khi bạn gọi 'DoFinal', và sau đó' DoFinal' sẽ ghi ra các byte cuối cùng (với padding), vì vậy nếu bạn có 'DoFinal' ghi vào mảng đầu ra cuối cùng của bạn, bạn cần cung cấp cho nó chỉ mục của nó sẽ ghi vào đâu mảng. – jbtule