当前位置: 首页 > 知识库问答 >
问题:

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

郭知
2023-03-14

我有一个服务器和一个客户端。
客户端可能采用不同的技术,如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密钥。我正在使用RSA/ECB/PKCS1Padding算法。并且我还确保所有客户端也在其代码中考虑了1填充。

Client-1(Java)
如果Client也是用Java制作的,则成功地从Client公钥的指数和模生成公钥。我正在使用下面的代码来生成客户端RSA密钥对。

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

Client-2(php)
现在问题是Client是否在php中。成功生成了than公钥,但当我尝试使用该公钥加密时,当我在服务器中使用默认提供程序时,会出现错误的填充异常。我正在使用贝娄代码生成客户端RSA密钥对。

  $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提供程序...它给我以下例外情况:

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

注意:我从调试代码中观察到,客户端的公钥模字节在服务器端的位长在1020到1023之间变化。虽然我们定义大小为1024,但它从未达到1024。

共有1个答案

龙默
2023-03-14

还是不明白问题到底出在哪...
但我已经为它实现了工作...

我在使用指数和模生成客户端公钥时遇到了问题。
所以现在我使用了一种公钥证书的标准格式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'];
     KeyFactory keyFactory=KeyFactory.getInstance("RSA");
     byte[] pubKeyBits = Base64.decodeBase64(clientPublickeyView.getModulusBytes());
     PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(pubKeyBits));
 类似资料:
  • 主要的问题是,我对C相当陌生,OpenSSL留档对我来说不够清晰,我尝试过使用读和写rsa键到C中的pem文件,但我不太明白。例如,函数如何创建私有和公共?而从何而来?pcszPassphrase的意义是什么? 我会解释,好像这是某种伪代码,这就是我想做的,粗体部分是我不知道如何做的: 生成私钥和公钥作为十六进制缓冲区(客户端) 基本上,我知道如何处理AES加密/解密和通信协议,反正他们已经实现了

  • 我正在Erlang中创建一个应用程序,给定一个RSA私钥,它可以返回RSA公钥和与该priv密钥相关联的x509公钥。 ----只是一个更新---- 在花了一些时间了解x509并阅读了Erlang public_key文档后,我找到了一个解决方案: 如果我可以通过简单地获取模数和publicExponent,从“RSaprivateKey”生成“RSapublicKey”,那么生成这两个键的代码如

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 我创造了私人 我的公钥如下- 我认为我的公钥应该是PEM格式: 但是,我不知道如何将其转换为上述格式。需要帮助! 提前感谢。

  • 我使用我编写的程序生成了一个 PKCS#1 RSA 密钥对。我已经输出公钥作为 ASN.1数据结构的DER编码。 然而,当我试图在OpenSSL 和< code>rsautl命令中使用它时,OpenSSL说 我尝试过DER和PEM格式。 是否有额外的编码和/或数据结构需要我申请才能在OpenSSL中使用? 这是我的命令行: PEM 格式的公钥数据结构

  • 我以这种格式将私钥保存在DB中。 我需要从中提取公钥。openssl\u pkey\u get\u详细信息需要资源,但如何从字符串创建资源? 我试过这个 错误是openssl\u pkey\u get\u details()期望参数1是资源,给定布尔值 编辑1: 我试图从@kbarborak bellow获得解决方案,但$pk\u get是错误的: var_转储的输出为: