非对称加密算法 --- RSA签名算法
生活随笔
收集整理的這篇文章主要介紹了
非对称加密算法 --- RSA签名算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- RSA原理
- RSA應用場景
- RSA加密場景
- RSA簽名場景
- RSA加解密和簽名算法的java實現
RSA原理
通過一定的規則,生成公鑰和私鑰,公鑰和私鑰總是成對出現。
公鑰可以公開出去,任何人都可以知道。
私鑰只有自己知道。
RSA算法能保證,公鑰加密后的密文,只有對應的私鑰才能解密。或者,私鑰加密后的密文,只有對應的公鑰才能解密。
而且不能通過公鑰得到私鑰,也不能通過私鑰算出公鑰。
關于為什么公私鑰直接不能互相轉換,請看我之前的一篇文章:
非對稱加密算法之RSA算法實現
RSA應用場景
RSA加密場景
A給B傳一條消息,要保證哪怕消息被截取了,也不能讓別人知道消息的真正含義。
1、B生成公鑰和私鑰,私鑰自己保留,把公鑰傳給A
2、A用公鑰加密要傳的消息,然后把密文傳給B
3、B用私鑰解密密文,得到真正的消息。
這樣做的好處是,就算有人把中間的密文和公鑰都拿到了,他也獲取不到明文。
因為RSA的特點就是公鑰加密,必須用對應的私鑰才能解密。而私鑰一直是B保管。
RSA簽名場景
同樣的,A給B傳一條消息,可以明文傳輸,但要保證,B收到的,就是A發出的,不能被別人惡意修改。
1、B生成公鑰和私鑰,私鑰自己保留,把公鑰傳給A
2、A用公鑰對要傳的信息進行簽名,形成簽名信息。A將簽名信息和明文一起傳給B
3、B收到明文和簽名后,用私鑰對簽名進行驗證,如果驗證通過,則證明B收到的明文就是A發出的明文。
這樣做的好處是,哪怕中間有人截取到明文和簽名,只要修改任意一個,B那里最終都不會驗證通過。
RSA加解密和簽名算法的java實現
import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;public class TestRsa {// 私鑰對象private PrivateKey sk;// 公鑰對象private PublicKey pk;// 私鑰字符串private String privateKeyStr;// 公鑰字符串private String publicKeyStr;// 初始化公鑰私鑰public TestRsa() throws NoSuchAlgorithmException {KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");rsa.initialize(1024);KeyPair keyPair = rsa.generateKeyPair();sk = keyPair.getPrivate();pk = keyPair.getPublic();privateKeyStr = new String(Base64.encodeBase64(sk.getEncoded()));publicKeyStr = new String(Base64.encodeBase64(pk.getEncoded()));}// 公鑰加密public String encrypt(String str, String publicKey) throws Exception {//base64編碼的公鑰byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));return outStr;}// 私鑰解密public String decrypt(String str, String privateKey) throws Exception {//64位解碼加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64編碼的私鑰byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);String outStr = new String(cipher.doFinal(inputByte));return outStr;}// 私鑰簽名public String sign(String str) throws Exception {Signature signature = Signature.getInstance("SHA1withRSA");signature.initSign(this.sk);signature.update(str.getBytes());byte[] sign = signature.sign();return new String(Base64.encodeBase64(sign));}// 公鑰驗證public boolean verify(String str, String sign) throws Exception {Signature signature = Signature.getInstance("SHA1withRSA");signature.initVerify(this.pk);signature.update(str.getBytes());return signature.verify(Base64.decodeBase64(sign.getBytes("UTF-8")));}public static void main(String[] args) throws Exception {String str = "這是加密前的明文";TestRsa testRsa = new TestRsa();String encrypt = testRsa.encrypt(str, testRsa.publicKeyStr);System.out.println("加密后的密文:" + encrypt);String decrypt = testRsa.decrypt(encrypt, testRsa.privateKeyStr);System.out.println("解密后的明文:" + decrypt);// 簽名String sign = testRsa.sign(str);System.out.println("簽名結果:" + sign);// 驗證boolean verify = testRsa.verify(str, sign);System.out.println("驗證結果:" + verify);// true// 驗證反例String str2 = "這是被惡意修改過的偽原文";boolean verify2 = testRsa.verify(str2, sign);System.out.println("驗證結果2:" + verify2);// false} }最終結果:
加密后的密文:Pc/lj5beiojR1BIiEG1O9fooVOmwDgQixN9qX19ofU3Myq5iOViMqEM2lUZ+tmihms3BrLahZze2FeZVR1wrTSk24ZTK5rjKtL1GZLsQI6m/wNXmk9bA5gYbcR6ivZSTEw5a9+77mcAFuAgpeSmSM825NOTAt7epZeUt7i9FPNY= 解密后的明文:這是加密前的明文 簽名結果:Oe2XuGCb5mBwE4JTRPcemipOSuXEsw+hxido6r3/FSyDhx371sdg6/iRYQk6C2FuOqOpltWBJ4gA7x+VfJSJoA94+EIu5WxOaupaPumzNrsfhC/ZtYRUw0PfUvR5j232LH5bfA+Dh6pGbo1gu6qMVf8EtS63BoGHi9SYP068uss= 驗證結果:true 驗證結果2:false總結
以上是生活随笔為你收集整理的非对称加密算法 --- RSA签名算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【读书笔记】--- 《码出高效:java
- 下一篇: 计算机组成原理201501,计算机组成原