有谁知道如何使用RSA公钥和私钥加密和解密字符串对象?
我使用KeyPair生成器在下面创建了私钥和公钥,但我现在想要使用公钥来加密数据,并使用私钥来解密它。
public class Keys {
private static KeyPairGenerator generator;
private static KeyPair keyPair;
private static PrivateKey mPrivateKey;
private static PublicKey mPublicKey;
private static SecureRandom secureRandom;
private static final String SHA1PRNG = "SHA1PRNG";
public static final String RSA = "RSA";
private Keys() throws NoSuchAlgorithmException {
generator = KeyPairGenerator.getInstance("RSA");
}
/**
* Generate private and public key pairs
*
* @throws NoSuchAlgorithmException
*/
private static void generateKeyPair() throws NoSuchAlgorithmException {
// create SecureRandom object used to generate key pairs
secureRandom = SecureRandom.getInstance(SHA1PRNG);
// initialise generator
generator = KeyPairGenerator.getInstance(RSA);
generator.initialize(1024, secureRandom);
// generate keypair using generator
keyPair = generator.generateKeyPair();
// asssign private and public keys
setPrivateKey(keyPair.getPrivate());
setPublicKey(keyPair.getPublic());
}
/**
* Get private key from key generated
* @return
* @throws NoSuchAlgorithmException
*/
public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException {
if (mPrivateKey == null) {
generateKeyPair();
}
return mPrivateKey;
}
private static void setPrivateKey(PrivateKey privateKey) {
mPrivateKey = privateKey;
}
/**
* Get public key from key pair generated
*
* @return
* @throws NoSuchAlgorithmException
*/
public PublicKey getPublicKey() throws NoSuchAlgorithmException {
if (mPublicKey == null) {
generateKeyPair();
}
return mPublicKey;
}
private static void setPublicKey(PublicKey publicKey) {
mPublicKey = publicKey;
}
这是可能的,还是加密必须共享和使用相同的密钥?
主要目标是这个。
我将有两个客户端可以相互发送和接收加密数据。
让客户A收到加密数据:
客户B请求客户A的公钥。 客户端B加密字符串并将其发送给客户端A. 客户端A接收此加密的字符串,然后使用自己的私钥对其进行解密。
如果客户B希望接收加密数据,则反之亦然。
答案 0 :(得分:5)
RSA加密只能用于加密小于密钥模数的数据。即2048位RSA公钥只能加密256字节的数据。填充字节需要一些这样的数据,因此通常只剩下一个用于播放的空间。
通常,这是通过混合加密方案解决的。也就是说,数据本身是使用临时对称会话密钥加密的,然后会话密钥使用收件人的公钥加密。加密数据和加密会话密钥都将发送给收件人。
您可能希望考虑类似OpenPGP的内容,它会实现此行为(以及更多内容)。 BouncyCastle支持Java的OpenPGP实现。