【问题标题】:encrypt rsa android from public key .pem format从公钥 .pem 格式加密 rsa android
【发布时间】:2017-08-10 08:56:44
【问题描述】:

我已经在许多 stackoverflows 帖子中徘徊,但仍然无法弄清楚我的代码有什么问题。

public class KripAsim {
String hasil;

public String encrypt(String text) {
    try {

        String PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvCNqSslgCndo8vfNrkXFDLXmst024Oi8D7LEiJFjYBva4kBKKISe8rKp58kCLLHjv90RN+Dy2KWcf0eFkKaqc3zILBI99JhV1z8TFOzmt5dfgW6fD1ucBfsK6pWxK84DddyOqKldwHlReqjuDHT2jLue51vpXaCa12WV5bMnGsfy3vZKnp699YCguqRpTR1MijZ9pz8WqldrR0a/DCaq5YxZ7lvjwuWIodQy3S3XRHAaeaUrFHFFLumzXAGuP447oRYR0p+1qsy8+wOtrsGm8m8bMg+C1XGMblkODtOFHz3wtrRZ5OwzgEm7J7odmSX8mSYBZYLcnUVqIFRsQkZLiwIDAQAB";

        byte [] decoded = Base64.decode(PUBLIC_KEY,Base64.NO_WRAP);
        KeyFactory keyFac = KeyFactory.getInstance("RSA");
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);

        PublicKey pubkey = keyFac.generatePublic(keySpec);

        Cipher rsa;
        rsa = Cipher.getInstance("RSA");
        rsa.init(Cipher.ENCRYPT_MODE, pubkey);
        hasil = Base64.encodeToString(rsa.doFinal(text.getBytes("UTF-8")),Base64.NO_WRAP);
        return hasil;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return hasil;

}
}

它返回空值。请帮忙。提前致谢

【问题讨论】:

  • 我从 .pem 格式中获取了密钥并删除了 BEGIN 和 END,就这样。
  • 它是否打印任何堆栈跟踪?

标签: android encryption rsa


【解决方案1】:

PublicKey pubkey = keyFac.generatePublic(keySpec); 行抛出 InvalidKeySpecException,因为您在本应提供 X509EncodedKeySpec 时错误地提供了 PKCS8EncodedKeySpec

您还应该在Cipher.getInstance() 方法中完全指定转换字符串。以下从您的代码中提取的片段说明了这一点:

byte[] decoded = Base64.decode(PUBLIC_KEY, Base64.DEFAULT);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decoded);

PublicKey pubkey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
Cipher rsa = Cipher.getInstance("RSA/ECB/OAEPwithSHA-256andMGF1Padding");
rsa.init(Cipher.ENCRYPT_MODE, pubkey);
String hasil = Base64.encodeToString(rsa.doFinal(text.getBytes("UTF-8")),
                                     Base64.NO_WRAP);
return hasil;

最后,您应该避免直接使用 RSA 加密数据。正确的方法是使用hybrid encryption 方案,其中数据使用分组密码加密,例如 GCM 模式下的 AES,使用随机生成的 AES 密钥,然后使用 RSA 加密此密钥。这方面的例子很多,供参考。

【讨论】:

  • 我也使用php,所以加密的密钥将被发送到服务器,然后在那里解密。你对填充有什么建议吗?我在 php 中使用 open ssl
  • @rebellatrix:这是另一个问题。
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2011-04-21
  • 2010-11-03
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多