gpt4 book ai didi

java - 如何在 Java 中签署和验证 RSA PKCS#1 v2.0 签名

转载 作者:行者123 更新时间:2023-11-29 08:36:25 26 4
gpt4 key购买 nike

我正在尝试使用 PKCS1 v2.0 填充在 RSA+SHA1 中签名和验证签名。我没有在文档(JDK 或 JCE)中找到我必须使用哪种算法/填充。看来我必须使用 OAEP 填充,但我没有成功:

为了验证,我尝试使用签名者发送的公钥在 DECRYPT_MODE 中通过 Cipher:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA1ANDMGF1PADDING", "SunJCE"); 
cipher.init(Cipher.DECRYPT_MODE, pub); //exception !

但是我有一个异常(exception):

  java.security.InvalidKeyException: OAEP cannot be used to sign or verify signatures
at com.sun.crypto.provider.RSACipher.init(RSACipher.java:303)
at com.sun.crypto.provider.RSACipher.engineInit(RSACipher.java:207)
...

(由于未知原因,OAEPWITHSHA1ANDMGF1PADDING 只接受 ENCRYPT_MODE+PUBLIC KEY 或 DECRYPT_MODE+PRIVATE KEY,与我想做的相反....)

对于签名,我正在尝试使用 Signature 但我不知道该使用哪种算法:

Signature mySig2 = Signature.getInstance("SHA1withRSAandMGF1");

不起作用:

java.security.NoSuchAlgorithmException: SHA1withRSAandMGF1 Signature not available
at java.security.Signature.getInstance(Signature.java:229)
...

有人可以帮帮我吗?

最佳答案

希望我对此做出回应还不算太晚。最近我不得不面对与 RSA 加密相同的问题。我的签名者想要对通过 POST 发送的数据进行验证。这就是我设法在 Java 中处理它的方式。

第 1 步 - 将以下内容添加到您的项目中

bcprov-ext-jdk14-1.45.jar 
commons-codec-1.4.jar

第 2 步 - 声明您的密码

private Cipher cipher;

第 3 步 - 在您的类构造函数中调用下面

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
this.cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding");

第 4 步 - 从公钥文本字符串获取您的公钥

public PublicKey getPublic(String pubKey) throws Exception {
byte[] publicBytes = Base64.decodeBase64(pubKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}

第 5 步 - 验证方法

public boolean verfyRSA(String signature, String data, PublicKey key) throws Exception {

byte[] sign = Base64.decodeBase64(signature);
byte[] dat = Base64.decodeBase64(data);

Signature rsaVerify = Signature.getInstance("SHA1withRSAandMGF1");
rsaVerify.initVerify(key);
rsaVerify.update(dat);
return rsaVerify.verify(sign);
}

第 6 步 - 使用

Yourclass yc = new YourClass();
PublicKey publicKey = yc.getPublic("Your PublicKey without leading and trailing -------text------");
boolean b = yc.verfyRSA("POST_Signature", "POST_data", publicKey);

希望这对您有所帮助。注意 getInstance() 参数。这些是解决问题的方法。干杯

关于java - 如何在 Java 中签署和验证 RSA PKCS#1 v2.0 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43840827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com