gpt4 book ai didi

java - RSA公钥生成问题(PHP/Java集成)

转载 作者:行者123 更新时间:2023-11-30 07:14:52 27 4
gpt4 key购买 nike

我有一台服务器和一个客户端。
客户端可能采用不同的技术,例如 java 、 php。
服务器代码是用java编写的。
我在服务器中所做的是,获取客户端公钥的指数和模字节并生成客户端公钥。为了生成客户端公钥,我使用以下代码:

RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt);
keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKey clientPublicKey = (RSAPublicKey) keyFactory.generatePublic(spec);

要使用客户端公钥加密数据,我使用以下代码:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, clientPublickey);
scrambled = cipher.doFinal(buffer);

服务器信息
我已经实现了 RSA-1024 来加密 AES key 。我正在使用 RSA/ECB/PKCS1Padding 算法。我还确保所有客户也考虑在其代码中进行 1 次填充。

客户端 - 1(Java)
如果客户端也是用java制作的,则可以根据客户端公钥的指数和模数成功生成公钥。我正在使用下面的代码生成客户端 RSA key 的 key 对..

keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();

客户端-2 (php)
现在的问题是,如果客户端位于 php 中,则公钥已成功生成,但是当我尝试使用该公钥进行加密时,当我在服务器中使用默认提供程序时,会发生错误的填充异常。 我正在使用以下代码生成客户端 RSA key 的 key 对..

  $options = array('private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
'config' => realpath(__DIR__) . '/openssl.cnf');

#Generates New Private / Public Key Pair
$pkGenerate = openssl_pkey_new($options);
#Get Client Private Key
openssl_pkey_export($pkGenerate, $PrivateKey, NULL, $options);
#Get Client Public Key
$keyData = openssl_pkey_get_details($pkGenerate);


比我尝试过BC提供商 ...它给了我以下异常(exception):

org.bouncycastle.crypto.DataLengthException: input too large for RSA cipher.

当客户端处于 php 中时,当我尝试从指数和模数生成公钥时,我不明白发生了什么问题...如果客户端使用 java 则没有问题....并且工作完美..

欢迎任何类型的帮助...

注意:我从调试代码中观察到的是,客户端的公钥模字节在服务器端的位长度在 1020 到 1023 之间变化...尽管我们将大小定义为 1024,但它永远不会达到 1024。

最佳答案

仍然不明白问题到底是什么......
但我已经解决了它...

我陷入了使用指数和模数生成客户端公钥的困境。
所以现在我使用了一种标准格式的公钥证书 - DER & PEM。

我所做的是,使用以下代码从 PHP 端生成 DER 或 PEM,

$options = array('private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
'config' => realpath(__DIR__) . '/openssl.cnf');

#Get Client Public Key
$keyData = openssl_pkey_get_details($pkGenerate);
$clientPublicKey = $keyData['key'];
$this->clientData['clientPublicKeyPEM'] = $keyData['key'];

然后将生成的 PEM 发送到服务器(Java)。
在服务器端,我开发了以下代码来从 POM 字符串重新生成公钥。

     KeyFactory keyFactory=KeyFactory.getInstance("RSA");
byte[] pubKeyBits = Base64.decodeBase64(clientPublickeyView.getModulusBytes());
PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(pubKeyBits));

关于java - RSA公钥生成问题(PHP/Java集成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38584088/

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