使用 java 进行 RSA 解密失败
Failed to RSA decrypt with java
我的密码在 android 应用程序中使用 RSA 加密。在服务器端,我需要解密它。我有一个.pem文件,解密的php代码:
function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE)
{
$key_content = file_get_contents( $fileName );
$prikeyid = openssl_get_privatekey( $key_content, "1234" );
$crypttext = str_replace(' ', '+', $crypttext);
$crypttext = base64_decode( $crypttext );
$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
if( openssl_private_decrypt( $crypttext, $sourcestr, $prikeyid, $padding ) )
{
return $fromjs ? rtrim( strrev( $sourcestr ), "/0" ) : "" . $sourcestr;
}
return;
}
文件名为frivatekey文件(.pem文件)
现在我需要使用 java 来解密它。我尝试了一些方法,都失败了。这是我尝试过的:
- 使用.pem 文件生成.der 密钥文件
- 读取.der文件获取私钥
使用从.der文件读取的byte[]生成keyfile
public static PrivateKey generatePrivateKey(byte[] key)
throws NoSuchAlgorithmException, InvalidKeySpecException {
KeySpec keySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
解密我的密码
public static byte[] decrypt(PrivateKey privateKey, byte[] data)
throws Exception {
Cipher ci = Cipher.getInstance(ALGORITHOM, DEFAULT_PROVIDER);
ci.init(Cipher.DECRYPT_MODE, privateKey);
return ci.doFinal(data);
}
但是还是不行,不知道哪里出错了。
在 php 代码中我看到 $prikeyid = openssl_get_privatekey( $key_content, "1234" );
但我不知道“1234”是什么意思。这是否意味着使用“1234”来加密密钥文件?这是解密失败的原因吗?
$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
这两个都是不好的选择:
- 未填充的 RSA is insecure
- PKCS1 padding(也是默认的padding方式)是vulnerable to chosen-ciphertext attacks;因此它也不安全
请不要自己实施 RSA。您将使您的应用程序极度不安全。
推荐阅读:
我的密码在 android 应用程序中使用 RSA 加密。在服务器端,我需要解密它。我有一个.pem文件,解密的php代码:
function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE)
{
$key_content = file_get_contents( $fileName );
$prikeyid = openssl_get_privatekey( $key_content, "1234" );
$crypttext = str_replace(' ', '+', $crypttext);
$crypttext = base64_decode( $crypttext );
$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
if( openssl_private_decrypt( $crypttext, $sourcestr, $prikeyid, $padding ) )
{
return $fromjs ? rtrim( strrev( $sourcestr ), "/0" ) : "" . $sourcestr;
}
return;
}
文件名为frivatekey文件(.pem文件) 现在我需要使用 java 来解密它。我尝试了一些方法,都失败了。这是我尝试过的:
- 使用.pem 文件生成.der 密钥文件
- 读取.der文件获取私钥
使用从.der文件读取的byte[]生成keyfile
public static PrivateKey generatePrivateKey(byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException { KeySpec keySpec = new PKCS8EncodedKeySpec(key); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePrivate(keySpec); }
解密我的密码
public static byte[] decrypt(PrivateKey privateKey, byte[] data) throws Exception { Cipher ci = Cipher.getInstance(ALGORITHOM, DEFAULT_PROVIDER); ci.init(Cipher.DECRYPT_MODE, privateKey); return ci.doFinal(data); }
但是还是不行,不知道哪里出错了。
在 php 代码中我看到 $prikeyid = openssl_get_privatekey( $key_content, "1234" );
但我不知道“1234”是什么意思。这是否意味着使用“1234”来加密密钥文件?这是解密失败的原因吗?
$padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
这两个都是不好的选择:
- 未填充的 RSA is insecure
- PKCS1 padding(也是默认的padding方式)是vulnerable to chosen-ciphertext attacks;因此它也不安全
请不要自己实施 RSA。您将使您的应用程序极度不安全。
推荐阅读: