- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用在我的设备上生成的 RSA key 来解密我的 android 应用程序中的字符串。加密由 php 服务完成,使用我的应用程序提供的公共(public) rsa key 。我的问题是解密失败。
我正在做以下事情:
在 Android 上生成 key 对(使用 KeyPairGenerator.getInstance("RSA"))-> 确定
两个 key (公钥和私钥)在使用 Base64.encode(pubKey.getEncoded()) 进行“base64”编码后保存到文件中,与私钥相同。 -> 确定
当我调用我的 web 服务时,我在一个 post 变量中传递我的公钥(基于 64 位)-> OK
网络服务(一个 php 服务),使用公钥加密一个短字符串,使用 openssl_public_encrypt 函数。加密的字符串被转换为 base64。 -> 似乎没问题,函数不返回 FALSE。
最后一件事是解密这个字符串,我正在做以下事情:-> 不行
密码cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(cryptedBytes);
String decryptedString = new String(decryptedBytes);
System.out.println(解密字符串);
解密结果与我原来的字符串不匹配。
我错过了什么?
最佳答案
OpenSSL 默认使用 padding = OPENSSL_PKCS1_PADDING
。因此,要在两侧使用相同的填充机制,您应该使用 Cipher.getInstance("RSA/ECB/PKCS1Padding")
。这也是您可以在 Java SE 中使用的内容。
请注意,依赖密码学中的默认操作模式是非常危险的。许多实现都有不同的默认值,而且很难查找。因此,请始终尝试完全指定要使用的算法/模式。
您可以尝试其他 RSA 填充模式,但请注意 - 不幸的是 - Android 已经从他们改编的 Bouncy CaSTLe 源代码中禁用了很多算法和别名。
[编辑] 这是一个旧答案,现在强烈建议使用 OAEP 填充,或使用 RSA-KEM 的混合加密。
关于Android RSA 解密(失败)/服务器端加密(openssl_public_encrypt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819183/
刚迁移到新机器并遇到问题。 注意:这是 Windows 7、Apache 2.2.21、MySQL 5.5.16、php 5.3.8 设置。 每次我运行某个 PHP 脚本时,我都会遇到“页面加载错误
openssl_public_encrypt 显然无法处理任意明文。 这会在 Ubuntu PHP 7 上输出 Could not encrypt message.。 为什么它在这个 $msg 上失
为什么每次$encrypted的内容都不一样? // aquire public key from server $server_public_key = openssl_pkey_get_publi
我有一个生成公钥+私钥对的客户端(安卓设备)。它将公钥发送到服务器,服务器应使用公钥加密一些数据并将其返回,以便客户端稍后可以使用私钥对其进行解密。我的 PHP 代码记录了一条警告,指出我提供的公钥无
我有这个 RSA 公钥: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtixUGzGpLXgZ7AV1HfmIHV/FEF+fww77FekRc2oLhUO
我需要通过 PHP 在 MySQL 中存储一个加密但可恢复(由管理员)的密码。据我所知,最直接的方法是使用 openssl_public_encrypt(),但我不确定需要什么列类型。我可以根据 ke
我正在尝试使用在我的设备上生成的 RSA key 来解密我的 android 应用程序中的字符串。加密由 php 服务完成,使用我的应用程序提供的公共(public) rsa key 。我的问题是解密
我想获得与以下 ruby 代码等效的代码: $key = '-----BEGIN PUBLIC KEY----- some public key -----END PUBLIC KEY-----'
$publicKey = "../ssh/public/pub"; $plaintext = "要加密的字符串"; $pubKey = openssl_pkey_get_public($publicK
我是一名优秀的程序员,十分优秀!