由vb.net函数解密的字符串与由java函数加密的原始字符串不同

时间:2014-01-10 23:22:37

标签: java android asp.net vb.net encryption

我有一个在asp.net Web应用程序中使用web服务的Android应用程序。此Web服务需要用户名和加密密码。 问题是vb.net函数解密的密码与java函数加密的原始密码不一样。 这些是功能:

的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;
}

vb.net

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。

1 个答案:

答案 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")完成的 - 或者你正在使用的编码是什么。