我有一台服务器和一台客户端
客户端可能使用不同的技术,如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个填充。
客户端 - 1(Java)
如果客户端也是用java创建的,那么公钥是从客户端公钥的指数和模数成功生成的。
我使用下面的代码生成密钥对客户端RSA密钥..
keyPairGene = KeyPairGenerator.getInstance("RSA");
keyPairGene.initialize(1024);
KeyPair keyPair = keyPairGene.genKeyPair();
RSAPublicKey clientPublickey = (RSAPublicKey) keyPair.getPublic();
客户端-2(php)
现在的问题是,如果客户端是在php ..比公钥成功生成但当我尝试使用该公钥加密时,当我在服务器中使用默认提供程序时会发生错误的填充异常。
我使用波纹管代码生成密钥对客户端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中时使用指数和模数生成公钥时,我没有得到什么问题... 如果客户端在java中而不是没有问题....并且工作得很好..
欢迎任何类型的帮助...
注意: 我从调试代码中观察到的是, 客户端的公钥模数字节在服务器端的位长在1020到1023之间变化......虽然我们将大小定义为1024,但它永远不会达到1024.
答案 0 :(得分:1)
仍然没有得到究竟问题是什么...
但我已经为它实施了工作......
我在使用指数和模数生成客户公钥时陷入困境 所以现在我使用了一种标准格式的公钥证书 - 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));