0

重複の可能性:
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();
     }

 }
4

0 に答える 0