重複の可能性:
Java での AES 暗号化と C# での復号化
C# alg で暗号化されたファイルがあり、IV とキーがあり、IV は 16 バイト、キーは 32 です。暗号化プロパティは AES/CBC/PKCS7Padding です。これは256バイトの暗号化であるため、暗号化を行った後、キーを保存します。バイト[]には0〜255の範囲の数字が含まれます。128未満のすべての数字を使用してファイルを暗号化すると、Javaコードがファイルを適切に復号化することが証明されました. ただし、バイト [] に 127 より大きいものが含まれているファイルを復号化しようとすると、キーが正しくないため、復号化に失敗します。Java でバイトを見ると、241 が -14 に変換されることを意味する符号付きに自動変換されます。ビットは同じで動作するはずだと思っていましたが、動作しません。Javaコードでは、バイトを文字列に配置して、C#で暗号化に使用されているものと正確に一致し、C#で復号化に機能することを確認しました。それらは変換されますが、渡される byte[] に配置されると変換されます。
助けてください
bool Encrypt(string fileIn,string fileOut, Guid archiveKey, SymmetricAlgorithm alg) { // まず、ファイル ストリームを開きます var fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read, FileShare.None); var fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
// Now create a crypto stream through which we are going
// to be pumping data.
// Our fileOut is going to be receiving the encrypted bytes.
var x = alg.CreateEncryptor();
var cs = new CryptoStream(fsOut,
x, CryptoStreamMode.Write);
// Now will will initialize a buffer and will be processing
// the input file in chunks.
// This is done to avoid reading the whole file (which can
// be huge) into memory.
bufferLen = Shared.GetFileAttributes.ProcessingBufferSize;
buffer = new byte[bufferLen];
do
{
// read a chunk of data from the input file
bytesRead = fsIn.Read(buffer, 0, bufferLen);
// encrypt it
cs.Write(buffer, 0, bytesRead);
var inc = bytesRead == Shared.GetFileAttributes.ProcessingBufferSize ? 1 : bytesRead / Shared.GetFileAttributes.ProcessingBufferSize;
} while (bytesRead != 0);
// close everything
// this will also close the unrelying fsOut stream
cs.Close();
fsIn.Close();
return true;
}
Javaコードpublic void DecryptTheFile(String fileName、String fileOut、String keys)が例外をスローします
{
setupKeys(IV, KEY,keys);
// setup the cipher with the keys
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec key = new SecretKeySpec(KEY, "AES/CBC/PKCS7Padding");
IvParameterSpec ips = new IvParameterSpec(IV);
cipher.init(Cipher.DECRYPT_MODE, key,ips);
// decrypt a file
byte[] buffer = new byte[1024];
InputStream iFile = new FileInputStream(fileName);
OutputStream oFile = new FileOutputStream(fileOut);
iFile = new CipherInputStream(iFile, cipher);
int r = 0;
while ((r = iFile.read(buffer, 0, 1024)) > 0) {
oFile.write(buffer, 0, r);
}
oFile.close();
iFile.close();
}
private void setupKeys(byte[] IV,byte[] KEY,String keys)
{
String[] keyparts = keys.split(",");
for (int i = 0; i < 16; i++)
{
Long l = Long.parseLong(keyparts[i]);
IV[i] = (byte) (l.byteValue() );
if (siv == null) siv = l.toString();
else siv = siv + l.toString();
}
for (int i = 16; i < 47; i++)
{
Long l = Long.parseLong(keyparts[i]);
KEY[i - 16] = (byte) (l.byteValue() & 0xff);
if (skey == null ) skey = l.toString();
else skey = skey + l.toString();
}
}