JDK自带方法实现RSA数字签名

摘要:
1011importjdbc.pro.lin.MyRSA;其他算法需要第三方软件包支持*/22publicstaticfinalStringSIGNATURE_ALGORITHM=“SHA1withRSA”;字节[]>PLAIN_ TEXT.getBytes());“+newString(decodedText));

JDK 6只支持MD2withRSA, MD5withRSA, SHA1withRSA

其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle)

--20151126 更正:JDK 7已经可以支持SHA256withRSA和SHA512withRSA了

JDK的密钥长度默认仍是1024

复制代码
  1 package jdbc.pro.lin;
  2 
  3 import java.security.InvalidKeyException;
  4 import java.security.NoSuchAlgorithmException;
  5 import java.security.PrivateKey;
  6 import java.security.PublicKey;
  7 import java.security.Signature;
  8 import java.security.SignatureException;
  9 import java.util.Map;
 10 
 11 import jdbc.pro.lin.MyRSA;
 12 
 13 /**
 14  * RSA数字签名,借用MyRSA中的算法,不再重复
 15  * 数字签名遵循“私钥签名,公钥验签”原则,因为私钥是个人身份认证
 16  * @author Kinsley
 17  *
 18  */
 19 public class MySignature {
 20     
 21     /** 数字签名算法。JDK只提供了MD2withRSA, MD5withRSA, SHA1withRSA,其他的算法需要第三方包才能支持 */
 22     public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
 23     
 24     public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world";
 25     public static void main(String[] args)
 26     {
 27         //建立两套公私钥对
 28         Map<String, byte[]> keyMap1 = MyRSA.generateKeyBytes();
 29         PublicKey publicKey1 = MyRSA.restorePublicKey(keyMap1.get(MyRSA.PUBLIC_KEY));
 30         PrivateKey privateKey1 = MyRSA.restorePrivateKey(keyMap1.get(MyRSA.PRIVATE_KEY));
 31         
 32         Map<String, byte[]> keyMap2 = MyRSA.generateKeyBytes();
 33         PublicKey publicKey2 =MyRSA.restorePublicKey(keyMap2.get(MyRSA.PUBLIC_KEY));
 34         PrivateKey privateKey2 =MyRSA.restorePrivateKey(keyMap2.get(MyRSA.PRIVATE_KEY));
 35         
 36         /** 假设现在A签名后向B发送消息
 37          * A用B的公钥进行加密
 38          * 用自己A的私钥进行签名
 39          */
 40         byte[] encodedText = MyRSA.RSAEncode(publicKey2, PLAIN_TEXT.getBytes());
 41         byte[] signature = sign(privateKey1, PLAIN_TEXT.getBytes());
 42         
 43         /**
 44          * 现在B收到了A的消息,进行两步操作
 45          * 用B的私钥解密得到明文
 46          * 将明文和A的公钥进行验签操作
 47          */
 48         
 49         byte[] decodedText = MyRSA.RSADecode(privateKey2, encodedText).getBytes();
 50         System.out.println("Decoded Text: " + new String(decodedText));
 51         
 52         System.out.println("Signature is " + verify(publicKey1, signature, decodedText));
 53     }
 54     
 55     /**
 56      * 签名,三步走
 57      * 1. 实例化,传入算法
 58      * 2. 初始化,传入私钥
 59      * 3. 签名
 60      * @param key
 61      * @param plainText
 62      * @return
 63      */
 64     public static byte[] sign(PrivateKey privateKey, byte[] plainText)
 65     {
 66         try {
 67             //实例化
 68             Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
 69             
 70             //初始化,传入私钥
 71             signature.initSign(privateKey);
 72             
 73             //更新
 74             signature.update(plainText);
 75             
 76             //签名
 77             return signature.sign();
 78             
 79         } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
 80             // TODO Auto-generated catch block
 81             e.printStackTrace();
 82         }
 83         
 84         return null;
 85     }
 86     
 87     /**
 88      * 验签,三步走
 89      * 1. 实例化,传入算法
 90      * 2. 初始化,传入公钥
 91      * 3. 验签
 92      * @param publicKey
 93      * @param signatureVerify
 94      * @param plainText
 95      * @return
 96      */
 97     public static boolean verify(PublicKey publicKey, byte[] signatureVerify, byte[] plainText )
 98     {
 99         try {
100             //实例化
101             Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
102             
103             //初始化
104             signature.initVerify(publicKey);
105             
106             //更新
107             signature.update(plainText);
108             
109             //验签
110             return signature.verify(signatureVerify);
111         } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
112             // TODO Auto-generated catch block
113             e.printStackTrace();
114         }
115         
116         return false;
117     }
118 }
复制代码
 

免责声明:文章转载自《JDK自带方法实现RSA数字签名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ansible 安装发现问题及解决方法WPF中引入外部资源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# aes/cbc/pkcs5padding 模式的算法

#region 新订购接口加解密 /// <summary> /// 对字符进行UrlEncode编码 与Java通用版 /// string转Encoding格式 /// </summary> /// <param name="text">...

Identityserver4配置证书

IS4中如果token的类型是JWT,则需要使用RS256算法生成非对称签名,这意味着必须使用私钥来签名JWT token,并且必须使用对应的公钥来验证token签名,即验证token是否有效。使用RS256可以保证IS4服务端是JWT的唯一签名者,因为IS4服务端是唯一拥有私钥的一方,前提是私钥不会被泄露。所以我们需要一个证书为我们提供私钥和公钥。在开发...

GPG操作——签名验证

问题描述: 可能大家都遇到过软件在下载过程中由于网络原因导致下载的软件体积与实际软件体积不符。最常见的办法是对待下载文件附加一个摘要文件。这种做法比较常见,也比较容易实现。但是,还是会有一个问题:如果我篡改了网站,改变了文件的内容,并对该文件做了一次摘要,替换了原有的摘要文件。那用户下载的文件就失去了摘要验证的意义。如何避免这种问题呢? 解决方案: 软件提...

Java加密与解密笔记(三) 非对称加密

非对称的特点是加密和解密时使用的是不同的钥匙。密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然。 另外,密钥还可以用于数字签名。数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据内容进行处理得到一个签名,查看这个签名是否与对方传递的签名一致。 在非对称加密中用密钥来指公钥和私钥。   RSA RAS是最早的非对称签名,是1977年由罗...

C#(99):加密与解密 Sytem.Security.CryptoGraphy

一、Hash加密,使用HashAlgorithm哈希算法类的派生类(MD5、SHA1等) 特点:只能加密,不可逆。可对目标信息生成一段特定长度唯一的Hash值。 HashAlgorithm派生类包括: KeyedHashAlgorithm: 显示所有加密哈希算法实现均必须从中派生的抽象类。  MD5: 表示 MD5 哈希算法的所有实现均从中继承的抽象类。...

苹果开发之App签名

如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的 Apple developer是最基础的账号类型,主要用来在App Store下载各种应用(包括xCode等开发工具和SDK库)及在iCloud上备份文件和照片...