我的Android应用程序实现了RSA加密,但后端无法解密应用程序生成的令牌。这是代码,公钥的开始行和结束行在调用之前都被删除了,会有什么问题吗?
String encryptedToken = Base64.encodeToString(encrypt(publicKey, "4111111111111111"), Base64.NO_WRAP);
public static byte[] encrypt(String publicKey, String data) {
if (TextUtils.isEmpty(publicKey) || TextUtils.isEmpty(data)) {
return null;
}
try {
// Decode the modified public key into a byte[]
byte[] publicKeyByteArray = Base64.decode(publicKey.getBytes("UTF-8"),Base64.NO_WRAP);
Cipher mCipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyByteArray);
Key key = keyFactory.generatePublic(x509KeySpec);
mCipher.init(Cipher.ENCRYPT_MODE, key);
return mCipher.doFinal(data.getBytes("UTF-8"));
}
catch (UnsupportedEncodingException e) {
Log.e("RSAKEY", e.getMessage());
}
catch (NoSuchPaddingException e) {
Log.e("RSAKEY", e.getMessage());
} catch (NoSuchAlgorithmException e) {
Log.e("RSAKEY", e.getMessage());
} catch (InvalidKeyException e) {
Log.e("RSAKEY", e.getMessage());
} catch (InvalidKeySpecException e) {
Log.e("RSAKEY", e.getMessage());
} catch (IllegalBlockSizeException e) {
Log.e("RSAKEY", e.getMessage());
} catch (BadPaddingException e) {
Log.e("RSAKEY", e.getMessage());
}
return null;
}
后端团队提供了以下可以工作的示例代码,但它是针对桌面Java的。Android库没有base64.getEncoder方法。这和我写的非常相似,但我的就是不起作用。
// Decode the modified public key into a byte[]
byte[] publicKeyByteArray = Base64.getDecoder().decode(publicKey.getBytes(StandardCharsets.UTF_8));
// Create a PublicKey from the byte array
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByteArray);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
// Get an instance of the Cipher and perform the encryption
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherText = cipher.doFinal(ccNum.getBytes(StandardCharsets.UTF_8));
// Get the encrypted value as a Base64-encoded String
String encodeToStr = Base64.getEncoder().encodeToString(cipherText);
// Print out the encoded, encrypted string
System.out.println("Encrypted and Encoded String: " + encodeToStr);
我比较了每一步的字节数组值。桌面密码和android密码得到的输入完全相同。然而,来自Android code Cipher.dofinal的结果不能被后端解密。如果我把桌面结果放到REST调用体中,它们工作得很好,所以它不是由REST调用引起的。
最后团队里有人破解了这个。原因是Android操作系统使用Bouncy castle,后端使用Sun作为提供者,导致后端抛出BadPaddingException。要使其工作,密码需要在Android上以这种方式初始化:
mCipher.init(Cipher.ENCRYPT_MODE, key, new
OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA1,
PSource.PSpecified.DEFAULT));
欲了解更多详细信息,请访问本文:http://bouncy-castle.1462172.n4.nabble.com/problems-with-oaep-sha-256-hash-crypto-td1466852.html
本文向大家介绍Android 获取签名公钥和公钥私钥加解密的方法(推荐),包括了Android 获取签名公钥和公钥私钥加解密的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Android 获取签名公钥和公钥私钥加解密的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
并且我将这个函数称为用RSA公钥加密DSA密钥的函数:
问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(
我遵循以下示例:http://www.baeldung.com/java-bouncy-castle 我有几个问题: 将此应用到我的真实场景中,我只有收件人的RSA公钥,而不是整个X509Certificate。我四处打探了一下,但我不确定我该怎么做。有可能吗? 另一件事是我看到JceCMSEncryptorBuilder接受了一个ASN1Objectidentifier。我们目前正在使用这样的方
说明 微信支付-获取RSA加密公钥SDK,企业付款到银行卡接口需要。 你还需要执行openssl rsa -RSAPublicKey_in -in weixin-rsa-public.pem -pubout 将命令行输出的证书内容覆盖到weixin-rsa-public.pem文件中才可使用 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch
在SpringBoot中有一个“rest-server” 服务在某个地方安装了许多Java中的“rest-clients”。我不控制它。 “rest-server”为每个(!)生成公钥/私钥对客户端并与客户端共享pub密钥 每个“Rest-Client”生成自己的公钥/私钥对,并与“Rest-Server”共享公钥。客户端共享其公钥和唯一ID。 “Rest-Clients”不时轮询“”Rest-S