将RijndaelManaged转换为Java
我想将附带的代码从vb.net转换为java 我已经做了一些尝试,但到目前为止还没有完全转换代码 也许有人能帮我 致意 CB 这就是我尝试过的:将RijndaelManaged转换为Java,java,.net,vb.net,Java,.net,Vb.net,我想将附带的代码从vb.net转换为java 我已经做了一些尝试,但到目前为止还没有完全转换代码 也许有人能帮我 致意 CB 这就是我尝试过的: import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; import java.security.InvalidAlgorithmParameterException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class clRijndalManaged {
public clRijndalManaged() {
// TODO Auto-generated constructor stub
}
private final String characterEncoding = "UTF-8";
private final String cipherTransformation =
// "AES/CBC/PKCS5Padding";
"AES/CFB/NoPadding";
// "AES/CBC/NoPadding";
// "Rijndael/CBC/PKCS7Padding";
private final String aesEncryptionAlgorithm = "AES";
public byte[] decrypt(byte[] cipherText, byte[] key, byte [] initialVector)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
{
Cipher cipher = Cipher.getInstance(cipherTransformation);
SecretKeySpec secretKeySpecy = new SecretKeySpec(key, aesEncryptionAlgorithm);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec);
cipherText = cipher.doFinal(cipherText);
return cipherText;
}
public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException
{
Cipher cipher = Cipher.getInstance(cipherTransformation);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, aesEncryptionAlgorithm);
IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
plainText = cipher.doFinal(plainText);
return plainText;
}
private byte[] getKeyBytes(String key) throws UnsupportedEncodingException{
byte[] keyBytes= new byte[16];
byte[] parameterKeyBytes= key.getBytes(characterEncoding);
System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length));
return keyBytes;
}
/// <summary>
/// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string
/// </summary>
/// <param name="plainText">Plain text to encrypt</param>
/// <param name="key">Secret key</param>
/// <returns>Base64 encoded string</returns>
public String encrypt(String plainText, String key)
throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException{
byte[] plainTextbytes = plainText.getBytes(characterEncoding);
byte[] keyBytes = getKeyBytes(key);
return Base64.getEncoder().encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes));
}
/// <summary>
/// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher)
/// </summary>
/// <param name="encryptedText">Base64 Encoded String</param>
/// <param name="key">Secret Key</param>
/// <returns>Decrypted String</returns>
public String decrypt(String encryptedText, String key)
throws KeyException, GeneralSecurityException, GeneralSecurityException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException,
IOException{
byte[] cipheredBytes = Base64.getDecoder().decode(encryptedText);
byte[] keyBytes = getKeyBytes(key);
return new String(decrypt(cipheredBytes, keyBytes, keyBytes), characterEncoding);
}
}
这是vb.net中的工作代码
Function fncVerschluesseln(ByVal strKlartext As String, ByVal strKey As System.Security.SecureString, ByVal strSalt As String) As String
If Trim(strKlartext) = "" Then
Return "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
Exit Function
End If
Dim rd As New RijndaelManaged
Dim md5 As New MD5CryptoServiceProvider
Dim objIntPtr As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(strKey)
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(fncHash(strSalt & System.Runtime.InteropServices.Marshal.PtrToStringBSTR(objIntPtr), "MD5")))
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(objIntPtr)
md5.Clear()
rd.Key = key
rd.GenerateIV()
Dim iv() As Byte = rd.IV
Dim ms As New MemoryStream
ms.Write(iv, 0, iv.Length)
Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(strKlartext)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
Dim encdata() As Byte = ms.ToArray()
fncVerschluesseln = Convert.ToBase64String(encdata)
cs.Close()
rd.Clear()
End Function
Function fncEntschluesseln(ByVal strCrypt As String, ByVal strKey As System.Security.SecureString, ByVal strSalt As String) As String
If strCrypt = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" Then
Return ""
Exit Function
End If
Dim rd As New RijndaelManaged
Dim rijndaelIvLength As Integer = 16
Dim md5 As New MD5CryptoServiceProvider
Dim objIntPtr As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(strKey)
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(fncHash(strSalt & System.Runtime.InteropServices.Marshal.PtrToStringBSTR(objIntPtr), "MD5")))
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(objIntPtr)
md5.Clear()
Dim encdata() As Byte = Convert.FromBase64String(strCrypt)
Dim ms As New MemoryStream(encdata)
Dim iv(15) As Byte
ms.Read(iv, 0, rijndaelIvLength)
rd.IV = iv
rd.Key = key
Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)
If ms.Length - rijndaelIvLength = -16 Then
fncEntschluesseln = ""
Exit Function
End If
Dim data(ms.Length - rijndaelIvLength) As Byte
Dim i As Integer = cs.Read(data, 0, data.Length)
fncEntschluesseln = System.Text.Encoding.UTF8.GetString(data, 0, i)
cs.Close()
rd.Clear()
End Function
好的,那么实际的问题是什么?你想让我们对VB代码进行反向工程以了解它应该做什么吗?你想让我们运行你的java代码来找出它(不)在做什么吗?任何有帮助的东西:-)。第一个目标是让解密在java中工作。也许有人有过将RijndaelManaged转换为java的经验?我想我已经发现的一件事是,这个java实现的密钥长度是有限的,md5字符串的长度应该是到use@C.B.这就是为什么不使用“md5字符串”(我相信您考虑的是十六进制字符串),而是字节。从用Java实现加密和解密开始,当你能正确地做到这一点时,你不会被细节绊倒。问题是我希望与vb.net应用程序兼容,并解密现有的值
Function fncVerschluesseln(ByVal strKlartext As String, ByVal strKey As System.Security.SecureString, ByVal strSalt As String) As String
If Trim(strKlartext) = "" Then
Return "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
Exit Function
End If
Dim rd As New RijndaelManaged
Dim md5 As New MD5CryptoServiceProvider
Dim objIntPtr As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(strKey)
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(fncHash(strSalt & System.Runtime.InteropServices.Marshal.PtrToStringBSTR(objIntPtr), "MD5")))
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(objIntPtr)
md5.Clear()
rd.Key = key
rd.GenerateIV()
Dim iv() As Byte = rd.IV
Dim ms As New MemoryStream
ms.Write(iv, 0, iv.Length)
Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(strKlartext)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
Dim encdata() As Byte = ms.ToArray()
fncVerschluesseln = Convert.ToBase64String(encdata)
cs.Close()
rd.Clear()
End Function
Function fncEntschluesseln(ByVal strCrypt As String, ByVal strKey As System.Security.SecureString, ByVal strSalt As String) As String
If strCrypt = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" Then
Return ""
Exit Function
End If
Dim rd As New RijndaelManaged
Dim rijndaelIvLength As Integer = 16
Dim md5 As New MD5CryptoServiceProvider
Dim objIntPtr As IntPtr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(strKey)
Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes(fncHash(strSalt & System.Runtime.InteropServices.Marshal.PtrToStringBSTR(objIntPtr), "MD5")))
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(objIntPtr)
md5.Clear()
Dim encdata() As Byte = Convert.FromBase64String(strCrypt)
Dim ms As New MemoryStream(encdata)
Dim iv(15) As Byte
ms.Read(iv, 0, rijndaelIvLength)
rd.IV = iv
rd.Key = key
Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)
If ms.Length - rijndaelIvLength = -16 Then
fncEntschluesseln = ""
Exit Function
End If
Dim data(ms.Length - rijndaelIvLength) As Byte
Dim i As Integer = cs.Read(data, 0, data.Length)
fncEntschluesseln = System.Text.Encoding.UTF8.GetString(data, 0, i)
cs.Close()
rd.Clear()
End Function