2012-03-06 37 views
1

私はJava/C#ソケット(Javaサーバー、C#クライアント)を介して送信するすべてのデータを暗号化します。 私はAES256を使いたいですが、JavaとC#で同じ暗号化コードを生成することはできません。誰も私に2つの例を教えてもらえますか?1はJavaで、1はC#で同じ結果を生成し、結果を正しく復号化できますか?C#/ Java | AES256暗号化/復号化

私がこれまで試したどのような

public Encrypt(AOBCore instance){ 
    try { 
     String message="This is just an example"; 

      // Get the KeyGenerator 

      KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
      kgen.init(256); // 192 and 256 bits may not be available 


      // Generate the secret key specs. 
      SecretKey skey = kgen.generateKey(); //Cantget 'test' in here... 
      byte[] raw = skey.getEncoded(); 

      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 


      // Instantiate the cipher 

      Cipher cipher = Cipher.getInstance("AES"); 

      cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

      byte[] encrypted = 
      cipher.doFinal(message.getBytes()); 
      System.out.println("encrypted string: " + asHex(encrypted)); 

      cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
      byte[] original = 
      cipher.doFinal(encrypted); 
      String originalString = new String(original); 
      System.out.println("Original string: " + 
      originalString + " " + asHex(original)); 
    } catch (Exception e) { 
     instance.logMessage(e.getMessage()); 
    } 
} 

public static String asHex (byte buf[]) { 
     StringBuffer strbuf = new StringBuffer(buf.length * 2); 
     int i; 

     for (i = 0; i < buf.length; i++) { 
     if (((int) buf[i] & 0xff) < 0x10) 
     strbuf.append("0"); 

     strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
     } 

     return strbuf.toString(); 
    } 

}

static void Main(string[] args) 
    { 
     while (true) 
     { 
      var plain = Console.ReadLine(); 
      var key = GenerateKey(256); 
      var encoded = Encrypt(plain, key, 256); 
      Console.WriteLine("Encoded: " + encoded); 
      Console.WriteLine(Decrypt(encoded, key, 256)); 
     } 
    } 

    private static string GenerateKey(int keySize) 
    { 
     return "test"; 
    } 

    private static string Encrypt(string plainStr, string completeEncodedKey, int keySize) 
    { 
     RijndaelManaged aesEncryption = new RijndaelManaged(); 
     aesEncryption.KeySize = keySize; 
     aesEncryption.BlockSize = 256; 
     aesEncryption.Mode = CipherMode.CBC; 
     aesEncryption.Padding = PaddingMode.PKCS7; 
     aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]); 
     aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]); 
     byte[] plainText = ASCIIEncoding.UTF8.GetBytes(plainStr); 
     ICryptoTransform crypto = aesEncryption.CreateEncryptor(); 
     // The result of the encryption and decryption    
     byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length); 
     return Convert.ToBase64String(cipherText); 
    } 

    private static string Decrypt(string encryptedText, string completeEncodedKey, int keySize) 
    { 
     RijndaelManaged aesEncryption = new RijndaelManaged(); 
     aesEncryption.KeySize = keySize; 
     aesEncryption.BlockSize = 128; 
     aesEncryption.Mode = CipherMode.CBC; 
     aesEncryption.Padding = PaddingMode.PKCS7; 
     aesEncryption.IV = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[0]); 
     aesEncryption.Key = Convert.FromBase64String(ASCIIEncoding.UTF8.GetString(Convert.FromBase64String(completeEncodedKey)).Split(',')[1]); 
     ICryptoTransform decrypto = aesEncryption.CreateDecryptor(); 
     byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length); 
     return ASCIIEncoding.UTF8.GetString(decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length)); 
    } 
+1

これまでに試したことを示す必要があります。これはコード工場ではなく、インターネットにはたくさんの例があります。 – home

+0

私が試したことを追加...そして、いいえ、私はC#/ Javaの例でたくさんの情報を見つけることができません。 – Basaa

+1

同じ問題があるように見えます。http://stackoverflow.com/q/5295110/55209 –

答えて

4

問題は、あなたがciphermodeまたはJavaコード内のパディングを指定していないことです。これは、他のライブラリとの相互運用性が必要な場合には決してしたく​​ないアルゴリズムのデフォルトを使用します。 Javaで

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

PKCS5 this答えに応じて.NETでPKCS7と互換性があります:あなたのこのようなCipherを初期化します。賢明にCBCを使用しているので、暗号化と復号化の両方に同じ初期化ベクトルを使用するようにコードを変更する必要があります。 NOTは秘密鍵を使用する必要があります。 IVは無作為に生成されるべきである。 Java Cipherが生成したIVを暗号化のために生成するには、cipher.getIV()を呼び出します。

また、コメントに記載されている文字エンコードと一致するように注意してください。