我使用Bouncy Castle Crypto API来解密密文,并验证签名的邮件。
签名消息:
signedMessageOther: D0F39F8C8495CA83D2F24536083CCB280CD3A54B
邮件已解密:
01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414D0F39F8C8495CA83D2F2453608 3CCB280CD3A54B
只有最后20个字节与 signedMessageOther
匹配
的为什么吗
以下是密钥的内容:
Algorithm: RSA
Format: X.509
Key Length: 162
密钥是162字节-1024 bi,因此它是一个虚拟密钥 这是代码:
import java.security.PublicKey;
import java.security.Security;
import javax.crypto.Cipher;
public class DecyrptTest {
public static void main (String[] args) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//msg is some secret msg ,i have deleted.
String msg = "";
byte[] signedMsgBytes = SHA1.sign(msg);
String signedMessageOther=StringTools.bytesToHex(signedMsgBytes);
System.out.println("signedMessageOther: "+signedMessageOther);
String ct="1386cfed01490b9026903722324f80f8a56cc38169b46e15154ce9e7168ff589282855002e195a0c1a96d5fe540a7fa97b01ae24f365f39302e0c1186ee9308d6b94526741f7093dc2678c713bb2b1a8a6942decb35b16725353da523417cb835cea903485b19b63c2c444c8bc6c865ea78c749f10ca70b266f6078192f5c76c";
Cipher cipher = Cipher.getInstance("RSA", "BC");
PublicKey pubKey = KeyUtil.getPubKeyFromFile("res/key.pub");
System.out.println("Algorithm: "+pubKey.getAlgorithm());
System.out.println("Format: "+pubKey.getFormat());
System.out.println("Key Length: "+pubKey.getEncoded().length);
cipher.init(Cipher.DECRYPT_MODE, pubKey);
byte[] ctBytes=StringTools.hexStringToByteArray(ct);
System.out.println(ctBytes.length);
byte[] cipherText2 = cipher.doFinal(ctBytes);
System.out.println("cipher: " + StringTools.bytesToHex(cipherText2));
}
}
答案 0 :(得分:0)
你正在努力驾驶内燃机。你需要一辆车。
RSA是一种原始操作,可以与其他东西拼凑起来构成一个有用的加密系统。你不能单独使用它来完成整个工作。
我不确定这是否真的说密钥是162位,但如果是这样,那是一个完全没用的RSA密钥大小。 RSA密钥必须至少为384位才能完全使用。此外,RSA无法签署或加密大于密钥的数据。 162位大约是20个字节。听起来很熟悉吗?
您无法使用引擎开车上班。你需要一辆车。 RSA是一个引擎。