【问题标题】:AES Java EncryptionAES Java 加密
【发布时间】:2011-06-05 20:40:06
【问题描述】:

我正在为移动平台开发一个 Java 应用程序。该程序使用来自 Windows C# 应用程序的数据,该应用程序对移动应用程序将使用的在线数据库中的密码进行加密。

移动应用程序需要连接到数据库并从数据库中检索加密字符串并对其进行解密。

我使用以下代码可以正常解密

public String decrypt(String encryptedPassword)
    {
        String plainPassword = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.DECRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));
            plainPassword = new String(encoded);
        }
        catch (Exception ex)
        {
            Log.d("Decryption Error", ex.toString());
        }

        return plainPassword;
    }

解密工作非常好,所以我使用了与解密相同的代码进行加密,但将密码模式从解密更改为加密。但是,当我将加密密码打印到控制台时,它会打印出一堆垃圾,这些垃圾与应该存储在数据库中的字符串没有任何相似之处。

我使用以下代码进行加密

public String encrypt(String plainPasword)
    {
        String password = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.ENCRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(plainPasword.getBytes());
            password = new String(encoded);


        }
        catch (Exception ex)
        {
            Log.d("Encryption Error", ex.toString());
        }
        return password;
    }

感谢您能给我的任何帮助

【问题讨论】:

  • 你为什么要加密密码?!请使用加盐密码的哈希值..

标签: c# encryption aes


【解决方案1】:

在你调用的解密函数中

byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));

所以您将 ASCII 字节转换为 Base64 字节,然后对其进行解密。

当你实际上只打电话时,你会不会反过来做同样的事情

byte[] encoded = cipher.doFinal(plainPasword.getBytes());

您还正在从 byte[] 数组创建 new String() 而不指定编码,它使用平台的默认编码,而不是 ASCII。那也可能会破坏东西。

如果您查看 cipher.doFinal() 返回的应该是乱码的字节,它们与预期的数据没有任何相似之处吗?

【讨论】:

  • 打败我!只是想说同样的话:) 我还会问为什么 OP 自己这样做。除非你真的受到内存限制,否则有一些很好的库已经为你处理了所有这样的样板代码。
  • 我有一种感觉,我可能在这里做一些愚蠢的事情,但它确实发生了。我将您提到的行更改为 byte[] encoded = cipher.doFinal(Base64.encodeBase64(plainPasword.getBytes()));但它仍然输出的垃圾与 c# 创建的任何东西都不相似
  • 如果您的解密过程类似于 string->string to bytes->decodeBase64->decrypt,那么您的加密必须完全相反:加密 bytes->encodeBase64->string from bytes
  • 这就像decrypt(base64decode(bytes(input_string))) 用于解密,而string(base64encode(encrypt(bytes))) 用于加密; base64 和加密必须颠倒
  • 太棒了,非常感谢您的帮助,我现在可以正常工作了。再次感谢您。
猜你喜欢
  • 2012-03-28
  • 2012-06-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多