【问题标题】:Encryption and decryption with private key in JavaJava中使用私钥进行加密和解密
【发布时间】:2014-07-12 22:18:48
【问题描述】:

在我阅读了有关密码学(对称和非对称)方法的文章之后。许多文章都告诉我们私钥用于加密和解密数据。公钥用于加密数据。但是当我尝试开始在 Java 中实现时无法使用私钥加密和解密数据(我使用的是 RSA 算法)?如果可以,请给我一个链接。如果不支持,请回答为什么不支持?

//加密

Cipher encrypt=Cipher.getInstance("RSA");
encrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes());

//解密

Cipher decrypt=Cipher.getInstance("RSA");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage);

【问题讨论】:

    标签: java cryptography encryption-symmetric encryption-asymmetric


    【解决方案1】:

    要执行 RSA 加密,您需要使用公钥加密并使用私钥解密。此外,您应该使用定义明确的填充方法,例如 PKCS#1 v1.5 兼容的填充或 - 如果可用 - OAEP 填充。

    使用 RSA 私钥加密毫无意义,因为任何拥有公钥的人都可以解密。有一种叫做“原始 RSA”的东西,它基本上是模幂运算,但它只能与另一个填充方案一起使用来生成签名。在这种情况下,您希望每个拥有公钥的人都“解密”以验证签名。

    更多信息here 和here。

    所以加密是:

    // specify mode and padding instead of relying on defaults (use OAEP if available!)
    Cipher encrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
    // init with the *public key*!
    encrypt.init(Cipher.ENCRYPT_MODE, publicKey);
    // encrypt with known character encoding, you should probably use hybrid cryptography instead 
    byte[] encryptedMessage = encrypt.doFinal(msg.getBytes(StandardCharsets.UTF_8));
    

    和解密是:

    Cipher decrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
    decrypt.init(Cipher.DECRYPT_MODE, privateKey);
    String decryptedMessage = new String(decrypt.doFinal(encryptedMessage), StandardCharsets.UTF_8);
    

    【讨论】:

    • 加密签名不​​是用私钥加密吗?
    • @PeterBecker 最好不要那样想。检查RFC 3447 part 5.2:“...每个原语中的主要数学运算是求幂,就像在第 5.1 节的加密和解密原语中一样。除了输入和输出参数的名称之外,RSASP1 和 RSAVP1 与 RSADP 和 RSAEP 相同; 它们被区别开来,因为它们用于不同的目的。”。这仅适用于“教科书”或“原始”RSA,它不适合正常的加密目的。填充是方案的组成部分,并且有所不同。
    • 点了。实际上,我曾经在使用纯 RSA(问题之一)并且两个密钥的使用方式错误的情况下发现了一个损坏的加密方案。 Bouncy Castle 让您这样做,然后悄悄地更改填充,在这种情况下,这意味着加密没有随机化。
    【解决方案2】:

    公钥私钥加密的工作原理:

    1. 如果您使用您的私钥加密某些内容,任何人使用您的 公钥可以解密。
    2. 如果您使用公钥加密某些内容,则仅使用您的私钥 可以解密。

    您必须生成公钥私钥对。私钥仅供您使用,公钥可以提供给您信任的人。

    如何生成密钥对?

    $ openssl genrsa -out private_key.pem 1024
    $ openssl rsa -pubout -in private_key.pem -out public_key.pem
    

    或者去这里用java做-> JAVA RSA 当你这样做时回来问更多问题

    【讨论】:

      【解决方案3】:

      当您使用私钥加密时,它被称为证书。并且您的公钥被分发给客户端,以便他们可以打开它并验证证书的颁发者。客户端可以通过使用公钥加密来创建自己的签名的相同方式。服务器/颁发者可以通过使用私钥解密来验证它的相同方式。

      S:私钥 P:公钥

      S + 数据 = 证书 => 客户端(使用公钥打开/验证它) P + Data = Signature => Server / Issuer(用私钥打开/验证)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2012-04-11
        • 2017-11-25
        • 2015-01-25
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多