我有一个工作的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();
}
答案 0 :(得分:0)
您可以从源代码中获得一些提示:http://www.tamirgal.com/blog/page/SharpSSH.aspx
答案 1 :(得分:0)
我在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
结束班