我有这个 vb.net 代码(但我认为含义代码也与 c# 等效),我必须在 Java 中复制它并且无论如何我都无法修改它(只是复制):
Public Shared Function Encrypt(ByVal plainText As String, Optional key As String = "") As String
If String.IsNullOrEmpty(key) Then key = "sfdjf48mdfdf3054"
Dim encrypted As String = Nothing
Try
Dim inputBytes As Byte() = ASCIIEncoding.ASCII.GetBytes(plainText)
Dim pwdhash As Byte() = Nothing
'generate an MD5 hash from the password.
'a hash is a one way encryption meaning once you generate
'the hash, you cant derive the password back from it.
Dim hashmd5 As New MD5CryptoServiceProvider()
pwdhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
hashmd5 = Nothing
' Create a new TripleDES service provider
Dim tdesProvider As New TripleDESCryptoServiceProvider()
tdesProvider.Key = pwdhash
tdesProvider.Mode = CipherMode.ECB
encrypted = Convert.ToBase64String(tdesProvider.CreateEncryptor().TransformFinalBlock(inputBytes, 0, inputBytes.Length))
Catch e As Exception
Dim str As String = e.Message
Throw
End Try
Return encrypted
End Function
确切地说,这是一个 .NET 实用程序类函数。
现在,
我不知道如何复制
TripleDESCryptoServiceProvider()
在java代码中我开始写一些代码,但我不知道如何继续:
public static String encrypt(String plaintext, String enctoken){
if(enctoken == null)
enctoken = "sfdjf48mdfdf3054";
String encrypted = null;
byte[] plaintextByte = EncodingUtils.getAsciiBytes(plaintext);
//nel caso non funzionasse provare getBytes semplicemente
byte[] pwd = EncodingUtils.getAsciiBytes(Connessione.md5(enctoken));
try {
Cipher cipher = Cipher.getInstance("DESEDE/ECB/NoPadding");
SecretKeySpec myKey = new SecretKeySpec(pwd,"DESede");
cipher.init( Cipher.ENCRYPT_MODE, myKey);
try {
byte[] encryptedPlainText= cipher.doFinal(plaintextByte);
encrypted = Base64.encodeToString(encryptedPlainText, 0);
return encrypted;
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
更新:
我刚刚更新了代码。现在应该不错了。Enctoken String 将是一个字符串数据表示(刚刚知道)。这样,只有当第二个参数为 NULL 时才设置固定键
更新 2
不幸的是,c# hash 总是与 Java hash 不同!!如何在java中复制这个??
Dim hashmd5 As New MD5CryptoServiceProvider()
pwdhash = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key))
hashmd5 = Nothing
' Create a new TripleDES service provider
Dim tdesProvider As New TripleDESCryptoServiceProvider()
tdesProvider.Key = pwdhash
tdesProvider.Mode = CipherMode.ECB
encrypted = Convert.ToBase64String(tdesProvider.CreateEncryptor().TransformFinalBlock(inputBytes, 0, inputBytes.Length))
我以这种方式尝试过,但它不起作用:
哈希
public static final String md5(byte[] s) {
try {
MessageDigest m = MessageDigest.getInstance("MD5");
byte[] digest = m.digest(s);
String hash = EncodingUtils.getAsciiString(digest, 0, 16);
Log.i("MD5", "Hash: "+hash);
return hash;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}