解密Java AES 128Bit加密字符串,该字符串在VB.NET中仅使用密钥(无IV)加密

时间:2010-10-14 11:52:24

标签: vb.net aes encryption

我试图找到一些在VB.NET中使用的代码来解密使用Java加密库加密的字符串。

到目前为止,我发现的所有代码都使用初始化向量和密钥进行解密,但字符串仅使用密钥加密。 (使用初始化向量显然是Java中的可选步骤。)

有没有人知道我可以使用的代码(最好是在VB.NET中但我可以转换C#)来解密没有初始化向量的AES 128位编码字符串?

非常感谢

史蒂夫

2 个答案:

答案 0 :(得分:0)

这是c#语法,但VB.net的类应该都是相同的。您需要知道填充方案(如果有)和加密例程中使用的密码模式。可以肯定的是,如果没有使用IV,则使用ECB模式。

在构建包含密钥和加密数据的字节数组时,使编码正确也很重要。它可能是ASCII,Unicode,UTF ......

using System.Security.Cryptography;
using System.IO;

byte[] encryptedBytes = new byte[16]; // multiple of 16 (blocksize is 128 bits)
byte[] keyBytes = new byte[16]; // if keysize is 128 bits

Rijndael rijndael = Rijndael.Create();
rijndael.Mode = CipherMode.ECB; // But try other modes
rijndael.Padding = PaddingMode.None; // But try other padding schemes
rijndael.BlockSize = 128;
rijndael.KeySize = 128;
rijndael.Key = keyBytes;
ICryptoTransform cryptoTransform = rijndael.CreateDecryptor();

MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Write);

// Write the data to the stream to perform the decryption
cs.Write(encryptedBytes, 0, encryptedBytes.Length);

// Close the crypto stream to apply any padding.
cs.Close();

// Now get the decrypted data from the MemoryStream.
byte[] decryptedBytes = ms.ToArray();

答案 1 :(得分:0)

这是Java端的源代码。通过传入一个字符串来调用Decrypt:

  private static final byte[] __RawKey = {
   (byte) 0x30, (byte) 0x31, (byte) 0x32,
   (byte) 0x33, (byte) 0x34, (byte) 0x35,
   (byte) 0x36, (byte) 0x37
    };

   private String decrypt(String data) throws Exception {
   try {
     Key key = new SecretKeySpec(__RawKey, 0, __RawKey.length, "DES");
     byte[] _encrypted = data.getBytes();
     String sKey = new String(__RawKey);
     System.out.println(sKey);
     System.out.println(sKey.length());

     Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding", "SunJCE");                 
     cipher.init(Cipher.DECRYPT_MODE, key);
     byte[] _decrypted = cipher.doFinal(_encrypted);
     System.out.println("Decrypted: " + new String(_decrypted));
     return new String(_decrypted);
     }
     catch (Exception e) {
     System.out.println(e);
     return null;
     }
     }