原始文本,Java运行解密和Android运行解密都(略有)不同

时间:2013-12-12 21:08:22

标签: java android encryption

我正在尝试运行一个简单的加密/解密Android应用程序,并在Java中进行测试。我搜索过,但没有找到与我的问题相关的答案。

基本上,加密和解密在大多数情况下都有效,除了Java和Android中的解密后的文本与加密的原始文本略有不同。例如,how's it going?在Java中解密为howsitgoing=,在Android中解密为howsitgoAAAA

这是Java代码:

KeyStore ks = null;
try {
    ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    InputStream is = new FileInputStream("./raw/./akeystore");
    ks.load(is, "a".toCharArray());
} catch (Exception e) {
    e.printStackTrace();
}

Certificate cert = ks.getCertificate("akeypaircer");
RSAPublicKey publicKey = (RSAPublicKey)cert.getPublicKey();
Cipher c = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
c.init(Cipher.ENCRYPT_MODE, publicKey);

byte[] decodedString = Base64.decodeBase64("how's it going?".getBytes("UTF-8"));
byte [] cipher = c.doFinal(decodedString);

RSAPrivateKey privateKey = (RSAPrivateKey)ks.getKey("akeypair","a".toCharArray());
c.init(Cipher.DECRYPT_MODE, privateKey);

byte [] decrypted_cipher = c.doFinal(cipher);
byte[] encodedBytes = Base64.encodeBase64(decrypted_cipher);

System.out.println(new String(encodedBytes, "UTF-8"));

假设它与字符编码有关,但我对此一无所知......

我也猜测Java和Android之间可能存在差异,因为我必须使用两种不同的密钥库类型(Android版本为BKS版,Java版本为JKS版)。

1 个答案:

答案 0 :(得分:1)

这显然是错误的:

Base64.decodeBase64("how's it going?".getBytes("UTF-8"))

"how's it going?"不是基本的64字符串,你不能对它进行64解码。如果您需要一个表示为字符串的密文,那么我们的想法是对密文进行64位编码。对于明文,您需要将字符串转换为字节。但是你已经通过编码将其作为UTF-8。

简而言之:

  • 您可以通过执行(例如base 64,base 32,十六进制编码)从字节创建文本
  • 您可以通过执行(例如ASCII,ISO 8859-1“latin”,UTF-8和UTF-16BE或LE)从文本创建字节