【问题标题】:Verify data with Signature public key RSA java使用签名公钥 RSA java 验证数据
【发布时间】:2022-01-01 05:09:28
【问题描述】:

我有简单的文字。

然后我用Cipher RSA 加密这个文本。

但是,当使用Signature 加密文本验证此文本时,它总是返回 false。

生成密钥对:

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
KeyPair kp = keyPairGen.generateKeyPair();

纯文本:

byte[] plaintext = "a".getBytes(StandardCharsets.UTF_8);

使用 RSA 加密文本:

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
byte[] encryptText = cipher.doFinal(plaintext);

使用Signature验证数据:

Signature sig = Signature.getInstance("SHA256withRSA");
sig.initVerify(kp.getPublic());
sig.update(plaintext);
boolean result = sig.verify(encryptText);
System.out.println(result);

为什么这段代码总是返回false?如何验证正确的方式?

【问题讨论】:

  • 加密对应的不是验证而是解密。验证的对应物不是加密而是签名,这就是验证失败的原因。一方面加密和解密,另一方面签名和验证使用不同的填充。
  • 我不太明白你的意思。请给我更多解释,关于我的代码@Topaco
  • 加密/解密和签名/验证是不同的东西。您可以使用Signature#verify() 来验证使用Signature#sign() 创建的签名。
  • 哦,非常感谢。我现在明白了。

标签: java encryption cryptography digital-signature


【解决方案1】:

在数字签名中,您使用您的私有密钥对数据的哈希进行签名(加密)。

您可以使用 Signature 类,它将处理数据的处理:

public static void main(String[] args) throws Exception {
    String message = "Digital Signature Example";
    byte[] messageBytes = message.getBytes("UTF8");

    // Key generation
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(2048);
    KeyPair key = keyGen.generateKeyPair();

    // sign
    Signature sig = Signature.getInstance("SHA256WithRSA");
    sig.initSign(key.getPrivate());
    sig.update(messageBytes);
    byte[] signature = sig.sign();

    // verification
    sig.initVerify(key.getPublic());
    sig.update(messageBytes);
    boolean result = sig.verify(signature);

    // result
    System.out.println("Message   = " + message);
    System.out.println("Signature = "
            + Base64.getEncoder().encodeToString(signature));
    System.out.println("Verification Result = " + result);
}

或者您可以使用密码类加密/解密:

public static void main(String[] args) throws Exception {
    String message = "Digital Signature Example";
    byte[] messageBytes = message.getBytes("UTF8");

    // Key generation
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(2048);
    KeyPair key = keyGen.generateKeyPair();

    // sign
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key.getPrivate());
    byte[] messageHash = SHA(message);
    byte[] signature = cipher.doFinal(messageHash);
    
    // verification
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.DECRYPT_MODE, key.getPublic());
    byte[] decryptedMessageHash = cipher.doFinal(signature);
    byte[] messageHash = SHA(message);
    boolean result = Arrays.equals(decryptedMessageHash, messageHash);

    System.out.println("Message   = " + message);
    System.out.println("Signature = "
            + Base64.getEncoder().encodeToString(signature));
    System.out.println("Verification Result = " + result);
}


private static byte[] SHA(String message) throws Exception {
    MessageDigest digest = MessageDigest.getInstance("SHA-512");
    digest.update(message.getBytes("UTF8"));
    return digest.digest();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2016-04-17
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多