【问题标题】:Encrypt phone numbers in android using asymmetric encryption (PKCS8 key)使用非对称加密(PKCS8 密钥)在 android 中加密电话号码
【发布时间】:2015-12-04 06:22:58
【问题描述】:

我正在尝试使用 RSA 密钥通过以下步骤加密 Android 应用程序中的电话号码。加密密钥为 X509 格式,解密密钥为 PKCS8 格式。

面临的问题:加密文本和解密文本的结果不匹配。

生成密钥:-

$ openssl genrsa -out privkey.pem 2048

$ openssl rsa -in privkey.pem -pubout > pubkey.pub

将私钥转成pkcs8格式:-

$ openssl pkcs8 -topk8 -inform PEM -outform PEM -in privkey.pem -out privkey.pkcs8 -nocrypt

加密代码:-

String pubKeyPem = PUBKEY_X509.replace("-----BEGIN PUBLIC KEY-----\n", "")
.replace("-----END PUBLIC KEY-----", "");
byte [] encoded = Base64.decode(pubKeyPem, Base64.DEFAULT);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
privateKey = kf.generatePrivate(keySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

... encodedNum = cipher.doFinal(phNum);

解密代码:

String privKeyPEM = PRIVATEKEY.replace("-----BEGIN PRIVATE KEY-----\n", "")
.replace("-----END PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM, Base64.DEFAULT);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
privateKey = kf.generatePrivate(keySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

... decNum = cipher.doFinal(encNum);

我正在编码一个电话号码。编码和解码的电话号码不匹配。

算法将 0000 编码为 [B@4173bed8 .. 并将编码位解码回 [B@417412e8

我们可以看到初始数字 (0000) 与解密后的数字 ( [b41... ) 不匹配。

请就如何纠正此问题提出建议。

非常感谢。

【问题讨论】:

    标签: android public-key-encryption


    【解决方案1】:

    android IRC 小组非常有帮助。

    我在使用 toString() 将字节数组转换为字符串时犯了一个错误。当我们使用 toString() 将字节数组(或 byte[])转换为字符串时,我们打印对象的起始地址。所以实际上 [B@xxxxx 实际上是字节数组的地址(xxxx 部分),而我将它们混淆为数组的实际内容。

    上述建议的方法有效。加解密结果相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-30
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多