我遇到问题使用RSA加密字符串。 我的RSA是XML格式,看起来像这样:
<RSAKeyValue><Modulus>lT8ykfyV0R8o3mJZZezLKTKJpYB90Pzvp0moLzh9CTGfgsxLKYiAl+YGaoRfQ7hVQos5UlLIONHWKPNco9kKcmL6EBJvFc8wqBnhX0p4ML2WSv1yDIRsm9XXra82WHIa3+fxK8bNUJHrucxmpr9pDRPdZGZkz+Q9s94FcOyFKbs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
我尝试使用此类加密字符串:
import java.io.BufferedReader;
import java.io.StringReader;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.Security;
import javax.crypto.Cipher;
import org.bouncycastle.openssl.PEMReader;
import android.util.Base64;
import android.util.Log;
public class RsaEncryption {
private String publicKey;
public RsaEncryption(String publicKey)
{
this.publicKey = publicKey;
}
/*
* Function to encrypt the data.
*
*/
public String encrypt( String data ) throws Exception
{
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
byte[] keyBytes = Base64.decode( this.publicKey, 0 );
PublicKey publickey = strToPublicKey(new String(keyBytes));
cipher.init( Cipher.ENCRYPT_MODE , publickey );
// Base 64 encode the encrypted data
byte[] encryptedBytes = Base64.encode( cipher.doFinal(data.getBytes()), 0 );
return new String(encryptedBytes);
}
public static PublicKey strToPublicKey(String s)
{
PublicKey pbKey = null;
try {
BufferedReader br = new BufferedReader( new StringReader(s) );
PEMReader pr = new PEMReader(br);
Object obj = pr.readObject();
if( obj instanceof PublicKey )
{
pbKey = (PublicKey) pr.readObject();
}
else if( obj instanceof KeyPair )
{
KeyPair kp = (KeyPair) pr.readObject();
pbKey = kp.getPublic();
}
pr.close();
}
catch( Exception e )
{
Log.d("CIPHER", e.getMessage() );
}
return pbKey;
}
}
你可以看到我正在使用bouncycastle的jar 我得到的错误是: java.security.InvalidKeyException:传递给RSA的未知密钥类型
我不确定这部分
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
也许这就是问题? 如果是的话,那需要什么呢?
我做了几个小时的研究,仍然没有找到解决方案......
提前致谢:)
答案 0 :(得分:2)
CLOUDAMQP_URL=amqp://guest:guest@localhost:5672/
也许这就是问题?
不,不是。
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA1AndMGF1Padding", "BC");
在PKCS1中定义的最佳非对称加密填充方案,其中OAEPWith<digest>And<mgf>Padding
应替换为消息摘要算法和{{1} } 掩码生成函数。示例:<digest>
和<mgf>
。
问题出在您的公钥生成中。因为您的密钥是XML和Base64编码:
解码后,您将获得模数和指数的 字节数组 ,因此您可以轻松准备公钥对象,如下所示:
OAEPWithMD5AndMGF1Padding
答案 1 :(得分:1)
XML不是PEM。
您需要从XML中提取模数和公共指数,然后使用"RSA"
KeyFactory
实例和RSAPublicKeySpec
生成密钥。