【问题标题】:String decrypted by vb.net function is different than the original String encrypted by java functionvb.net函数解密的字符串与java函数加密的原始字符串不同
【发布时间】:2014-01-30 03:13:14
【问题描述】:

我有一个在 asp.net 网络应用程序中使用网络服务的 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

请帮帮我。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    服务器端您需要一个 Base64 编码的字符串,然后您将其转换为字节数组:

    Dim plaintext() As Byte= Convert.FromBase64String(encrypted_password)
    

    您应该在 Android 上执行与此相反的操作(将字节数组转换为 Base64 字符串)。相反,您只是在byte[] 上调用toString,这绝对不会给您想要的。

    您可以从字节数组中获取 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 中从字节数组创建字符串是使用 new String(someByteArray, "UTF-8") 或您使用的任何编码完成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多