我正在用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;
}谢谢你能给我的任何帮助
发布于 2011-01-09 03:37:33
在您调用的解密函数中
byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));因此,您要将ASCII字节转换为Base64字节,然后对其进行解密。
相反,当您实际上只调用
byte[] encoded = cipher.doFinal(plainPasword.getBytes());您还可以在没有指定编码的情况下从byte[]数组创建新的String(),它使用平台的默认编码,而不是ASCII码。这也可能会破坏一些东西。
如果你看一下cipher.doFinal()返回的被认为是胡言乱语的字节,它们与预期的数据没有任何相似之处吗?
https://stackoverflow.com/questions/4635686
复制相似问题