【问题标题】:java encrypt and decrypt using key pair?java使用密钥对加密和解密?
【发布时间】:2013-05-15 02:03:11
【问题描述】:

有人知道如何使用 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 希望接收加密数据,反之亦然。

【问题讨论】:

  • 您的密钥生成代码有什么问题吗?如果不是,那么它可能会从问题中删除。

标签: java encryption cryptography key-pair


【解决方案1】:

RSA 加密只能用于加密小于密钥模数的数据。 IE。一个 2048 位的 RSA 公钥只能加密 256 字节的数据。其中一些数据需要用于填充字节,因此通常留给的空间更少。

这通常通过混合加密方案来解决。也就是说,数据本身是用一个临时的对称会话密钥加密的,然后会话密钥是用接收者的公钥加密的。加密的数据和加密的会话密钥都会发送给接收者。

您可能希望考虑像 OpenPGP 这样的东西,它实现了这种行为(以及更多)。 BouncyCastle 为 Java 提供了 OpenPGP 实现。

【讨论】:

  • 嗯,这就是为什么 RSA 通常只用于加密像密码字段这样的小数据?
  • @jonney 是的。如果您的数据肯定总是很小,您可以直接使用 RSA 公钥对其进行加密。否则,您需要采用不同的方案(如上所述)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2011-05-09
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多