gpt4 book ai didi

java - 在android上,获取xml rsa公钥并用它加密一个字符串

转载 作者:行者123 更新时间:2023-11-30 02:00:20 30 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序并从我合作的公司的服务器获取这个公钥:

PFJTQUtleVZhbHVlPjxNb2R1bHVzPnZOcFhkRWVOTU5pZDhuOTlUekRGMVo4MDNvTEdRSzlqWnNFODlDd2tiS29GV0tGZmt2QTZKODBNWHhPZnhqbFZIYU8vYWM4YUpMc1AxWVR1RFNHVis3VExQL0puVVpyNlJQQTdpbFlmMitVWExiS0U2ZW1RYzBKdXlOaVArL0FTMGZmKzYwSnZQekhYeEdQQnVIbWtTcmRqdEtFV0JCZXJzWWNuQVJyT2ZSYz08L01vZHVsdXM+PEV4cG9uZW50PkFRQUI8L0V4cG9uZW50PjwvUlNBS2V5VmFsdWU+

服务器是带有 IIS 7.5 的 Windows。

base64decode 它给我这个 XML

<RSAKeyValue><Modulus>vNpXdEeNMNid8n99TzDF1Z803oLGQK9jZsE89CwkbKoFWKFfkvA6J80MXxOfxjlVHaO/ac8aJLsP1YTuDSGV+7TLP/JnUZr6RPA7ilYf2+UXLbKE6emQc0JuyNiP+/AS0ff+60JvPzHXxGPBuHmkSrdjtKEWBBersYcnARrOfRc=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

从这个 xml 中提取模数和指数,对其进行 base64 解码并为公钥对象制定规范:

    PublicKey pbKey = null;
XMLParser parser = new XMLParser();
Document doc = parser.getDomElement(publicKeyString);
Element rsakeyvalue = doc.getDocumentElement();

String modulusBase64 = parser.getValue(rsakeyvalue, "Modulus");
byte[] modulus = Base64.decode(modulusBase64, 0);

String exponentBase64 = parser.getValue(rsakeyvalue, "Exponent");
byte[] exponent = Base64.decode(exponentBase64, 0);

BigInteger modBigInteger = new BigInteger(1,modulus);
BigInteger exBigInteger = new BigInteger(1,exponent);

RSAPublicKeySpec spec = new RSAPublicKeySpec(modBigInteger, exBigInteger);
try {
KeyFactory factory = KeyFactory.getInstance("RSA");
pbKey = factory.generatePublic(spec);
} catch (Exception e) {
e.printStackTrace();
}

创建密码并添加要加密的纯文本:

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");

byte[] keyBytes = Base64.decode(this.publicKey, 0);

/* the strToPublicKey is the previews code block */
PublicKey publickey = strToPublicKey(new String(keyBytes));
cipher.init( Cipher.ENCRYPT_MODE , publickey );

// Base 64 encode removed.
//byte[] encryptedBytes = Base64.encode( cipher.doFinal(plainText.getBytes()), 0 );
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());

一切正常,但服务器不接受,我对其进行 base64 编码并将其作为字节数组发送。

服务器管理员说它太长了,应该是 128 位但它是 174 位...我做错了什么?

这把 key 怎么叫? RSA XML 是否正确?还是有别的名字?

如果有人知道如何使用它,我也可以从服务器获取 PEM 字符串。

编辑:我忘了在这里放一个重要的部分,我将数据作为字节数组发送到服务器,这就是我制作它的字符串的方式:

public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
StringBuilder byteArrayString = new StringBuilder();
int bytesLength = bytes.length;
int bytesCounter = 0;
for (byte aByte : bytes) {
bytesCounter++;
byteArrayString.append(unsignedToBytes(aByte));
if(bytesCounter < bytesLength){
byteArrayString.append(",");
}
}

已解决! - 解决方案:字符串生成器使用的字节是有符号的,所以我使用这个函数 unsignedToBytes() 使它们无符号,我删除了 encrypt() 函数上的 base64Encription。这就是问题所在,我希望它能帮助其他人。

最佳答案

你的变量命名是错误的。 encryptedBytes 包含的不是加密字节,而是base64编码的加密字节。

这就是您没有获得预期结果的原因。

Base64编码前的加密数据长度为128字节。

之后长度为172字节。

关于java - 在android上,获取xml rsa公钥并用它加密一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31584918/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com