【问题标题】:VB.Net equivalent for Java Rijndael decryption methodJava Rijndael解密方法的VB.Net等价物
【发布时间】:2013-03-26 18:42:06
【问题描述】:

下面显示了一个有效的 java 解密函数。 RijndaelAlgorithm 的 java 源代码是您在互联网上看到的标准代码 - 例如:

http://www.opensymphony.com/oscore/api/com/opensymphony/module/random/Rijndael_Algorithm.html

我正在尝试使用 VB.Net 重现此功能。我知道 .Net 支持 Rijndael,但我还没有找到与下面的 java 代码产生相同解密密码的组合。看起来很简单的任务,但我已经花了几天时间研究这个。

谁能告诉我或指导我在 VB.Net 中生成与 java 函数等效的函数的示例代码?

这是我的论点:

t = f8d44...cf22f8a     32 total characters 
keyArray = [113,64,51,102,120...98,98,108,115]  32 total bytes
keySize = 32
blockSize = 16

这是我的工作 java 函数:

public static String decrypt(String t, byte[] keyArray, int keySize, int blockSize)  
{
        StringBuffer plain = new StringBuffer(t.length());
        byte[] textBytes = RijndaelAlgorithm.getBytes(t);
        int cipherLen = textBytes.length;

        Object key = RijndaelAlgorithm.makeKey(setKeyLength(keyArray, keySize), keySize);

        for (int offset = 0; offset < cipherLen; offset += blockSize)
        {
              byte[] plainBytes = RijndaelAlgorithm.blockDecrypt(textBytes, offset, key, blockSize);

              plain.append(new String(plainBytes));
        }
        return plain.toString();
}

【问题讨论】:

    标签: java vb.net rijndael


    【解决方案1】:

    您可以从这里的源代码中得到一些提示:http://www.tamirgal.com/blog/page/SharpSSH.aspx

    【讨论】:

      【解决方案2】:

      我在VB.NET中使用了这两个函数,希望对你有帮助

      这就是我使用这些功能的方式

      _ConnectionString = RijndaelSimple.Decrypt(_ConnectionString, RijndaelPhrase, CurrentSession.ApplicationSession.Application.ApplicationGuid.ToString.ToLower, "SHA1", 2, RijndaelVector, 128)
      
      
      
      
      
      Imports System.Text.RegularExpressions
      Imports System.Data.SqlClient
      Imports System.Security.Cryptography
      Imports System.Text
      Imports System.IO
      
      ' <summary>
      ' This class uses a symmetric key algorithm (Rijndael/AES) to encrypt and 
      ' decrypt data. As long as encryption and decryption routines use the same 
      ' parameters to generate the keys, the keys are guaranteed to be the same.
      ' The class uses static functions with duplicate code to make it easier to 
      ' demonstrate encryption and decryption logic. In a real-life application, 
      ' this may not be the most efficient way of handling encryption, so - as 
      ' soon as you feel comfortable with it - you may want to redesign this class.
      ' </summary>
      
      Public Class RijndaelSimple
      
      ' <summary>
      ' Encrypts specified plaintext using Rijndael symmetric key algorithm
      ' and returns a base64-encoded result.
      ' </summary>
      ' <param name="plainText">
      ' Plaintext value to be encrypted.
      ' </param>
      ' <param name="passPhrase">
      ' Passphrase from which a pseudo-random password will be derived. The 
      ' derived password will be used to generate the encryption key. 
      ' Passphrase can be any string. In this example we assume that this 
      ' passphrase is an ASCII string.
      ' </param>
      ' <param name="saltValue">
      ' Salt value used along with passphrase to generate password. Salt can 
      ' be any string. In this example we assume that salt is an ASCII string.
      ' </param>
      ' <param name="hashAlgorithm">
      ' Hash algorithm used to generate password. Allowed values are: "MD5" and
      ' "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes.
      ' </param>
      ' <param name="passwordIterations">
      ' Number of iterations used to generate password. One or two iterations
      ' should be enough.
      ' </param>
      ' <param name="initVector">
      ' Initialization vector (or IV). This value is required to encrypt the 
      ' first block of plaintext data. For RijndaelManaged class IV must be 
      ' exactly 16 ASCII characters long.
      ' </param>
      ' <param name="keySize">
      ' Size of encryption key in bits. Allowed values are: 128, 192, and 256. 
      ' Longer keys are more secure than shorter keys.
      ' </param>
      ' <returns>
      ' Encrypted value formatted as a base64-encoded string.
      ' </returns>
      Public Shared Function Encrypt(ByVal plainText As String, _
                                     ByVal passPhrase As String, _
                                     ByVal saltValue As String, _
                                     ByVal hashAlgorithm As String, _
                                     ByVal passwordIterations As Integer, _
                                     ByVal initVector As String, _
                                     ByVal keySize As Integer) _
                             As String
      
          ' Convert strings into byte arrays.
          ' Let us assume that strings only contain ASCII codes.
          ' If strings include Unicode characters, use Unicode, UTF7, or UTF8 
          ' encoding.
          Dim initVectorBytes As Byte()
          initVectorBytes = Encoding.ASCII.GetBytes(initVector)
      
          Dim saltValueBytes As Byte()
          saltValueBytes = Encoding.ASCII.GetBytes(saltValue)
      
          ' Convert our plaintext into a byte array.
          ' Let us assume that plaintext contains UTF8-encoded characters.
          Dim plainTextBytes As Byte()
          plainTextBytes = Encoding.UTF8.GetBytes(plainText)
      
          ' First, we must create a password, from which the key will be derived.
          ' This password will be generated from the specified passphrase and 
          ' salt value. The password will be created using the specified hash 
          ' algorithm. Password creation can be done in several iterations.
          Dim password As PasswordDeriveBytes
          password = New PasswordDeriveBytes(passPhrase, _
                                             saltValueBytes, _
                                             hashAlgorithm, _
                                             passwordIterations)
      
          ' Use the password to generate pseudo-random bytes for the encryption
          ' key. Specify the size of the key in bytes (instead of bits).
          Dim keyBytes As Byte()
          keyBytes = password.GetBytes(keySize / 8)
      
          'Dim keyBytes2 As Byte()
          'keyBytes2 = password.Rfc2898DeriveBytes
      
          ' Create uninitialized Rijndael encryption object.
          Dim symmetricKey As RijndaelManaged
          symmetricKey = New RijndaelManaged()
      
          ' It is reasonable to set encryption mode to Cipher Block Chaining
          ' (CBC). Use default options for other symmetric key parameters.
          symmetricKey.Mode = CipherMode.CBC
      
          ' Generate encryptor from the existing key bytes and initialization 
          ' vector. Key size will be defined based on the number of the key 
          ' bytes.
          Dim encryptor As ICryptoTransform
          encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
      
          ' Define memory stream which will be used to hold encrypted data.
          Dim memoryStream As MemoryStream
          memoryStream = New MemoryStream()
      
          ' Define cryptographic stream (always use Write mode for encryption).
          Dim cryptoStream As CryptoStream
          cryptoStream = New CryptoStream(memoryStream, _
                                          encryptor, _
                                          CryptoStreamMode.Write)
          ' Start encrypting.
          cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
      
          ' Finish encrypting.
          cryptoStream.FlushFinalBlock()
      
          ' Convert our encrypted data from a memory stream into a byte array.
          Dim cipherTextBytes As Byte()
          cipherTextBytes = memoryStream.ToArray()
      
          ' Close both streams.
          memoryStream.Close()
          cryptoStream.Close()
      
          ' Convert encrypted data into a base64-encoded string.
          Dim cipherText As String
          cipherText = Convert.ToBase64String(cipherTextBytes)
      
          ' Return encrypted string.
          Encrypt = cipherText
      End Function
      
      ' <summary>
      ' Decrypts specified ciphertext using Rijndael symmetric key algorithm.
      ' </summary>
      ' <param name="cipherText">
      ' Base64-formatted ciphertext value.
      ' </param>
      ' <param name="passPhrase">
      ' Passphrase from which a pseudo-random password will be derived. The 
      ' derived password will be used to generate the encryption key. 
      ' Passphrase can be any string. In this example we assume that this 
      ' passphrase is an ASCII string.
      ' </param>
      ' <param name="saltValue">
      ' Salt value used along with passphrase to generate password. Salt can 
      ' be any string. In this example we assume that salt is an ASCII string.
      ' </param>
      ' <param name="hashAlgorithm">
      ' Hash algorithm used to generate password. Allowed values are: "MD5" and
      ' "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes.
      ' </param>
      ' <param name="passwordIterations">
      ' Number of iterations used to generate password. One or two iterations
      ' should be enough.
      ' </param>
      ' <param name="initVector">
      ' Initialization vector (or IV). This value is required to encrypt the 
      ' first block of plaintext data. For RijndaelManaged class IV must be 
      ' exactly 16 ASCII characters long.
      ' </param>
      ' <param name="keySize">
      ' Size of encryption key in bits. Allowed values are: 128, 192, and 256. 
      ' Longer keys are more secure than shorter keys.
      ' </param>
      ' <returns>
      ' Decrypted string value.
      ' </returns>
      ' <remarks>
      ' Most of the logic in this function is similar to the Encrypt 
      ' logic. In order for decryption to work, all parameters of this function
      ' - except cipherText value - must match the corresponding parameters of 
      ' the Encrypt function which was called to generate the 
      ' ciphertext.
      ' </remarks>
      Public Shared Function Decrypt(ByVal cipherText As String, _
                                     ByVal passPhrase As String, _
                                     ByVal saltValue As String, _
                                     ByVal hashAlgorithm As String, _
                                     ByVal passwordIterations As Integer, _
                                     ByVal initVector As String, _
                                     ByVal keySize As Integer) _
                             As String
      
          ' Convert strings defining encryption key characteristics into byte
          ' arrays. Let us assume that strings only contain ASCII codes.
          ' If strings include Unicode characters, use Unicode, UTF7, or UTF8
          ' encoding.
          Dim initVectorBytes As Byte()
          initVectorBytes = Encoding.ASCII.GetBytes(initVector)
      
          Dim saltValueBytes As Byte()
          saltValueBytes = Encoding.ASCII.GetBytes(saltValue)
      
          ' Convert our ciphertext into a byte array.
          Dim cipherTextBytes As Byte()
          cipherTextBytes = Convert.FromBase64String(cipherText)
      
          ' First, we must create a password, from which the key will be 
          ' derived. This password will be generated from the specified 
          ' passphrase and salt value. The password will be created using
          ' the specified hash algorithm. Password creation can be done in
          ' several iterations.
          Dim password As PasswordDeriveBytes
          password = New PasswordDeriveBytes(passPhrase, _
                                             saltValueBytes, _
                                             hashAlgorithm, _
                                             passwordIterations)
      
          ' Use the password to generate pseudo-random bytes for the encryption
          ' key. Specify the size of the key in bytes (instead of bits).
          Dim keyBytes As Byte()
          keyBytes = password.GetBytes(keySize / 8)
      
          ' Create uninitialized Rijndael encryption object.
          Dim symmetricKey As RijndaelManaged
          symmetricKey = New RijndaelManaged()
      
          ' It is reasonable to set encryption mode to Cipher Block Chaining
          ' (CBC). Use default options for other symmetric key parameters.
          symmetricKey.Mode = CipherMode.CBC
      
          ' Generate decryptor from the existing key bytes and initialization 
          ' vector. Key size will be defined based on the number of the key 
          ' bytes.
          Dim decryptor As ICryptoTransform
          decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)
      
          ' Define memory stream which will be used to hold encrypted data.
          Dim memoryStream As MemoryStream
          memoryStream = New MemoryStream(cipherTextBytes)
      
          ' Define memory stream which will be used to hold encrypted data.
          Dim cryptoStream As CryptoStream
          cryptoStream = New CryptoStream(memoryStream, _
                                          decryptor, _
                                          CryptoStreamMode.Read)
      
          ' Since at this point we don't know what the size of decrypted data
          ' will be, allocate the buffer long enough to hold ciphertext;
          ' plaintext is never longer than ciphertext.
          Dim plainTextBytes As Byte()
          ReDim plainTextBytes(cipherTextBytes.Length)
      
          ' Start decrypting.
          Dim decryptedByteCount As Integer
          decryptedByteCount = cryptoStream.Read(plainTextBytes, _
                                                 0, _
                                                 plainTextBytes.Length)
      
          ' Close both streams.
          memoryStream.Close()
          cryptoStream.Close()
      
          ' Convert decrypted data into a string. 
          ' Let us assume that the original plaintext string was UTF8-encoded.
          Dim plainText As String
          plainText = Encoding.UTF8.GetString(plainTextBytes, _
                                              0, _
                                              decryptedByteCount)
      
          ' Return decrypted string.
          Decrypt = plainText
      End Function
      

      结束类

      【讨论】:

      • 我认为让我感到困惑的部分原因是我的工作 java 函数没有对初始化向量进行任何引用。但是我见过的大多数 Vb.net 代码都需要一个——包括你的。我试图找到一个与我发布的 java 函数等效的 VB.Net 示例。感谢您的帮助
      • Hi Curitre:在 Freelancer.com、Elance.com 或 oDesk.com 上发布您的问题。我相信有人会花几块钱解决你的问题。这对我有用很多次。
      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多