我有一个在asp.net Web应用程序中使用web服务的Android应用程序。此Web服务需要用户名和加密密码。 问题是vb.net函数解密的密码与java函数加密的原始密码不一样。 这些是功能:
public String encrypt(String password, String key, String VecI) throws GeneralSecurityException, UnsupportedEncodingException{
byte[] sessionKey = key.getBytes();
byte[] iv = VecI.getBytes() ;
byte[] plaintext = password.getBytes();
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "DES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
String resp = ciphertext.toString();
return resp;
}
Public Shared Function decrypt(Byval encrypted_password As String, ByVal key As String, ByVal VecI As String) As String
Dim plaintext() As Byte= Convert.FromBase64String(encrypted_password)
Dim keys() As Byte = Encoding.ASCII.GetBytes(key)
Dim memdata As New MemoryStream
Dim transforma As ICryptoTransform
Dim des As New DESCryptoServiceProvider
des.Mode = CipherMode.CBC
transforma = des.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))
Dim encstream As New CryptoStream(memdata, transforma, CryptoStreamMode.Write)
encstream.Write(plaintext, 0, plaintext.Length)
encstream.FlushFinalBlock()
encstream.Close()
Return Encoding.ASCII.GetString(memdata.ToArray)
End Function
请帮助我。
Thank`s。
答案 0 :(得分:0)
服务器端您期望Base64编码的字符串,然后您将其转换为字节数组:
Dim plaintext() As Byte= Convert.FromBase64String(encrypted_password)
你应该在Android上做相反的事情(将字节数组转换为Base64字符串)。相反,你只是在toString
上拨打byte[]
,这肯定不会给你你想要的东西。
您可以从字节数组中获取Base64编码的字符串,如下所示:
String resp = Base64.encode(cipherText, Base64.DEFAULT);
您可以查看Base64 docs以获取更多信息。您可能需要使用提供的标志。
另一件需要考虑的事情是,您希望所有内容都采用ASCII编码。 String.getBytes()
返回编码为using the systems default charset的字符。密码可以使用非ASCII字符输入,例如é或¥,这可能会引入微妙的错误。我建议将所有内容切换到UTF-8 - 服务器端和客户端(这意味着将getBytes()
更改为getBytes("UTF-8")
,将Encoding.ASCII
更改为Encoding.UTF8
)。
顺便说一句,在Java中使用字节数组创建一个String是使用new String(someByteArray, "UTF-8")
完成的 - 或者你正在使用的编码是什么。