RSA public 密钥生成问题(PHP/Java 集成)
RSA public key generation issue (PHP/Java integration)
我有一台服务器和一台客户端。
客户端可能采用不同的技术,例如 java 、 php.
服务器代码写在java.
我在服务器上做的是,获取客户端 public 密钥的指数和模数字节并生成客户端的 public 密钥。
要生成客户端 public 密钥,我使用以下代码:
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt);
keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKey clientPublicKey = (RSAPublicKey) keyFactory.generatePublic(spec);
要使用客户端 public 密钥加密数据,我使用以下代码:
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 个填充。
客户 - 1 (Java)
如果客户端也在 java 中创建,则 public 密钥成功地从客户端 public 密钥的指数和模数生成。
我正在使用下面的代码生成客户端 RSA 密钥的密钥对。
keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();
客户端-2 (php)
现在的问题是,如果客户端在 php .. 成功生成 public 密钥,但是当我尝试使用那个 public 密钥加密时,当我使用时出现错误的填充异常服务器中的默认提供程序。
我正在使用波纹管代码生成客户端 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.
当客户端处于 php 时,当我尝试从指数和模数生成 public 密钥时,我不知道发生了什么问题...
如果客户端在 java 中,则没有问题....并且工作完美..
欢迎任何类型的帮助...
注意:
我从调试代码中观察到的是,
客户端的 public 服务器端密钥模数字节的位长度在 1020 到 1023 之间变化...尽管我们将大小定义为 1024,但它永远不会达到 1024。
仍然不明白问题到底是什么...
但我已经解决了它...
我在使用指数和模数生成 public 客户端密钥时遇到了问题。
所以现在我使用了一种标准格式的 public 密钥证书 - 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 字符串中重新生成 Public 键。
KeyFactory keyFactory=KeyFactory.getInstance("RSA");
byte[] pubKeyBits = Base64.decodeBase64(clientPublickeyView.getModulusBytes());
PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(pubKeyBits));
我有一台服务器和一台客户端。
客户端可能采用不同的技术,例如 java 、 php.
服务器代码写在java.
我在服务器上做的是,获取客户端 public 密钥的指数和模数字节并生成客户端的 public 密钥。
要生成客户端 public 密钥,我使用以下代码:
RSAPublicKeySpec spec = new RSAPublicKeySpec(modulusBigInt,exponentBigInt);
keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKey clientPublicKey = (RSAPublicKey) keyFactory.generatePublic(spec);
要使用客户端 public 密钥加密数据,我使用以下代码:
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 个填充。
客户 - 1 (Java)
如果客户端也在 java 中创建,则 public 密钥成功地从客户端 public 密钥的指数和模数生成。
我正在使用下面的代码生成客户端 RSA 密钥的密钥对。
keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();
客户端-2 (php)
现在的问题是,如果客户端在 php .. 成功生成 public 密钥,但是当我尝试使用那个 public 密钥加密时,当我使用时出现错误的填充异常服务器中的默认提供程序。
我正在使用波纹管代码生成客户端 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.
当客户端处于 php 时,当我尝试从指数和模数生成 public 密钥时,我不知道发生了什么问题... 如果客户端在 java 中,则没有问题....并且工作完美..
欢迎任何类型的帮助...
注意: 我从调试代码中观察到的是, 客户端的 public 服务器端密钥模数字节的位长度在 1020 到 1023 之间变化...尽管我们将大小定义为 1024,但它永远不会达到 1024。
仍然不明白问题到底是什么...
但我已经解决了它...
我在使用指数和模数生成 public 客户端密钥时遇到了问题。
所以现在我使用了一种标准格式的 public 密钥证书 - 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 字符串中重新生成 Public 键。
KeyFactory keyFactory=KeyFactory.getInstance("RSA");
byte[] pubKeyBits = Base64.decodeBase64(clientPublickeyView.getModulusBytes());
PublicKey pubKey=keyFactory.generatePublic(new X509EncodedKeySpec(pubKeyBits));