1、サービス側の暗号化と復号化:
輸入org.bouncycastle.jce.provider.BouncyCastleProvider。 輸入javax.crypto.Cipher; 輸入java.io.ByteArrayOutputStreamを。 インポート java.security *。; 輸入java.security.interfaces.RSAPrivateKey。 輸入java.security.interfaces.RSAPublicKey。 輸入java.security.spec.PKCS8EncodedKeySpec; 輸入java.util.Base64。 パブリック クラスRsaUtils { プライベート 静的な 最終文字列RSA_ALGORITHM =「RSA」。 プライベート 静的 最終 int型 = 128 MAX_DECRYPT_BLOCK 。 プライベート 静的 のRSAPublicKey公開。 プライベート 静的 RSAPrivateKeyのPrivateKey; パブリック 静的RsaUtilsインスタンス(){ 戻り 新しい)(RsaUtilsします。 } 公共 ボイド geneKeys()スロー持つNoSuchAlgorithmException { するKeyPairGeneratorするKeyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM、新しいBouncyCastleProvider())。 keyPairGenerator.initialize( 1024 )。 キーペア鍵ペア = keyPairGenerator.generateKeyPair()。 PrivateKey =(RSAPrivateKey)keyPair.getPrivate(); 公開 = (のRSAPublicKey)keyPair.getPublic(); } パブリック文字列encodeByPrivateKey(文字列本体)がスロー例外{ 暗号暗号 = Cipher.getInstance(RSA_ALGORITHM)を、 cipher.init(Cipher.ENCRYPT_MODE、のPrivateKey)。 返す。Base64.getEncoder()encodeToString(cipher.doFinal(body.getBytes( "UTF-8" ))); } パブリック文字列encodeByPublicKey(文字列本体)が スロー例外{ 暗号暗号 = Cipher.getInstance(RSA_ALGORITHM)を、 cipher.init(Cipher.ENCRYPT_MODE、公開); リターン。Base64.getEncoder()encodeToString(cipher.doFinal(body.getBytes( "UTF-8" ))); } パブリック文字列decodeByPrivateKey(文字列本体)が スロー例外{ 暗号暗号 = Cipher.getInstance(RSA_ALGORITHM)を、 cipher.init(Cipher.DECRYPT_MODE、のPrivateKey)。 返すdecryptByPrivateKey(体); } パブリック文字列decodeByPublicKey(文字列本体)が スロー例外{ 暗号暗号 = Cipher.getInstance(RSA_ALGORITHM)を、 cipher.init(Cipher.DECRYPT_MODE、公開); リターン 新しいです文字列(Cipher.doFinal(Base64.getDecoder()のデコード(ボディ))); } / ** *秘密鍵を復号化する * * @param encryptedStr * @return * / パブリック 文字列decryptByPrivateKey(文字列encryptedStr) { 試み { // ために復号化するための秘密鍵 バイト [] = privateKeyBytes ; privateKey.getEncoded() //はプライベート取得 keySpec =であるPKCS8EncodedKeySpecを新新(privateKeyBytes)であるPKCS8EncodedKeySpec; // データを復号化する取得 バイト []データ= decryptBase64(encryptedStrを)。 工場するKeyFactory = KeyFactory.getInstance( "RSA" ) のPrivateKeyのPrivateKey = factory.generatePrivate(keySpec); // 復号データ 暗号暗号= Cipher.getInstance(factory.getAlgorithm())を、 cipher.init(Cipher.DECRYPT_MODE、のPrivateKey ); // UTF-8でエンコードされた復号化情報を返す INT inputLen = data.length; ByteArrayOutputStream OUT = 新しい新しいByteArrayOutputStreamを(); intです OFFSET = 0 ; バイト[]キャッシュ; int型 I = 0 。 // 对数据分段解密 一方、(inputLen -オフセット> 0 ) { 場合(inputLen -オフセット> MAX_DECRYPT_BLOCK) { キャッシュ = cipher.doFinal(データ、オフセット、MAX_DECRYPT_BLOCK)。 } 他 { キャッシュ = cipher.doFinal(データ、オフセット、inputLen - オフセット)。 } out.write(キャッシュ、 0 、cache.length)。 I ++ ; オフセット =私は* MAX_DECRYPT_BLOCKを。 } バイト [] = decryptedData out.toByteArray(); out.close(); 戻り 新しい新しい文字列(decryptedData、 "UTF-8" ); } キャッチ(例外E) { e.printStackTrace(); } 戻り NULL ; } / * * * BASE64のデコード * * @param キーを復号Base64文字列を必要とする * @returnのバイト配列 * / パブリック 静的 バイト[] decryptBase64(文字列キー) { 返す(Base64.getDecoder)を(キー)を復号;. } パブリック コードします)。静的 ボイドメイン(文字列[]引数)スロー例外{ RsaUtilsのrsaUtils = 新しい)(RsaUtilsします。 rsaUtils.geneKeys(); 文字列はコード = rsaUtils.encodeByPrivateKey( "123456" )。 System.out.println( "加密前:" + 123456 )。 System.out.println( "公钥:" + 。Base64.getEncoder()encodeToString(RsaUtils.publicKey.getEncoded())); System.out.println( "私钥:" + 。Base64.getEncoder()encodeToString(RsaUtils.privateKey.getEncoded())); System.out.println( "私钥加密后:" + するSystem.out.println("公開鍵暗号化後:" + rsaUtils.encodeByPublicKey( "123456" )); のSystem.out.println( "公開鍵と復号化:" + rsaUtils.decodeByPublicKey(コードします)); } }
暗号化前:123456
公共:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgSZEMYSVYc / xAka4rLGtADBqKrZ2tzxLv9PpH4DgGqngfZbJDLEK1alGffXGwgg48mAryHtaCYt9d9xsIHqyYomQq5kASzaBSfOMrieCd5aGQSBot9v8yFcvHnUtnJ7IggXoBEfDLEn5tXHxJgQf6ra6tW / i89vTeuodHMvPBaQIDAQAB
プライベート:MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKBJkQxhJVhz / ECRrissa0AMGoqtna3PEu / 0 + kfgOAaqeB9lskMsQrVqUZ99cbCCDjyYCvIe1oJi3133GwgerJiiZCrmQBLNoFJ84yuJ4J3loZBIGi32 / zIVy8edS2cnsiCBegER8MsSfm1cfEmBB / qtrq1b + Lz29N66h0cy88FpAgMBAAECgYAV / lItSS0nKG8N6w9jdCpZNO / 1ZGI05at7CnnHIACABacK49jkd6 / FlcuSX1OYvRe3 / 8LMuyeC548vpQbsA815wl2IMQVBtG58i / jjWzhUh4VTgYVubloKBf7GLCxX39DFF5E9oOQa9cMOwwxDkSvU9DVeRvQGlcx8v0I / Lnub6wJBANnksVTY3smY7Ud1Xv2A4DIRHMWy / p9LyuTtVBjsvP7tKf3wUrGqkeVVEkkThpaZ + 2GRg59KDp1 + 4Mewid33JP8CQQC8UcvL + lWhm + Zw7eHW5fm + uldjHksl3jysNoqMoAa4D09pCekS3NpIE + Pcw4sI2c16FLG0wnN7ds1RZWGLSBGXAkEAx2axHgulvmnz4yw3NNjm0wq0APxwZckPsXa7OmAUCVtyzVBL7QlCoNO8eyGiTlo2IbDv + irkux7sh / I4COhucwJBAIAKIUVz1GsIA7s + kjG5tX + PVMEopLF / k8MHZlZMq6TTjAt / 2H + + ht6wQEfpU3aBL7iAWF kt2LTWRq0UAClh + 8sCQQC25D7x / UWopLVUFqJUJxDfs5iMIVKR / Gs8wNvsGt6Ke7cikgPue + aqhArb3XZIHF1BslWC6 / Ddwr2ZrtoueJ0F
秘密鍵の後:K / 5aACTTKj1OZmOSUmbavA1NXczkCgRfedUUj + PRlZTblBL9jvo7W1HzRDJDdPIsm1Br7XPFSWbekYVLMCboxr6ygyEa5NtFu7ku7pNvs7TkROVOS7JqDXWDUGSLINqgXl1D39 + ZWBCKnwZadkipPfd9ZHkEJfkJc23cMhz2C2c =
公開鍵暗号化後:k4QlyVJzti0EhSgpDz5K2bXt8RtfNrEGn7RwsGCjGk9WVzWrJoW5xP8wBJomVLeIeGK1mHEex4nYCxt4lW49f3HX85ZApAFQH31CBYSHwxpEfxoeNZF5SA65rNSeFdvMrOWdMWGoRxZzgF2GtqdSUC13PMNkGKhgMEGvVQOnNKE =
公開鍵と復号化:123456
2、フロントエンドの暗号化、RSA:
< HTML > < ヘッド> < スクリプトタイプ= "テキスト/ javascriptの" srcが= "aes.js" > </ スクリプト> < スクリプトSRC = "https://cdn.bootcss.com/jsencrypt/3.0.0-rc。 1 / jsencrypt.js " > </ スクリプト> </ ヘッド> < ボディ> < スクリプトタイプ= "テキスト/ javascriptの" > VAR aesFun = { オプション:{ originalStr:"123456 " 、 aesKey:" 1234567891234567 " }、 暗号化:関数(ワード){ VARのキー= CryptoJS.enc.Utf8.parse(この.options.aesKey)。 VaRのSRCS = CryptoJS.enc.Utf8.parse(ワード)。 VAR 暗号化= CryptoJS.AES.encrypt(SRCS、キー、{モード:CryptoJS.mode.ECB、パディング:CryptoJS.pad.Pkcs7})。 戻るencrypted.toString(); }、 復号化:関数(ワード){ VARのキー = CryptoJS.enc.Utf8.parse(この.options.aesKey); VAR 解読= CryptoJS.AES.decrypt(ワード、キー、{MODE:CryptoJS.mode.ECB、パディング:CryptoJS.pad.Pkcs7})。 返すCryptoJS.enc.Utf8.stringify(復号化).toString(); } } VARのオプション= aesFun.options; VARのencryptstr = aesFun.encrypt(options.originalStr); // console.info( "暗号化前:" +オプション.originalStr) // console.info( "暗号化キーと復号化キー:" + options.aesKey) // console.info( "暗号化:" + encryptstr) // console.info( "解密后:" + aesFun.decrypt(encryptstr)); VaRの暗号化= 新JSEncrypt(); VaRのencryptstr = " 123456 " ; VAR pubkeyで= " MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyWmqsl0DMtWrRS6VFF4dfbNx0aOqsrT3Yq61ZZVu8h3OnGTMUjCkYothw794C0FpSYCJpWBGl7Ip6dXkohQU9TgadHWZ4wuLPJIyVhm39gAK9KoMNtEoGQ6vjXAxOE6QAS8lTZvVZMa9c2cboGEKvgyIilpHtbuAO42dNZH2 + qQIDAQAB " 。 encrypt.setPublicKey(pubkeyで)。 VaRのデータ= encrypt.encrypt(encryptstr)。 console.info(「加密前: "+ Encryptstr) console.info(" 公開鍵:" + pubkeyで) console.info(" 公開鍵暗号化後:" + データ); </ スクリプト> </ ボディ> </ HTML >
index.htmlを:暗号化前の49:123456
のindex.html:50公共:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyWmqsl0DMtWrRS6VFF4dfbNx0aOqsrT3Yq61ZZVu8h3OnGTMUjCkYothw794C0FpSYCJpWBGl7Ip6dXkohQU9TgadHWZ4wuLPJIyVhm39gAK9KoMNtEoGQ6vjXAxOE6QAS8lTZvVZMa9c2cboGEKvgyIilpHtbuAO42dNZH2 + qQIDAQAB
のindex.html:51である公開鍵暗号:g27aG60 / xFupUpBwfCJKhiuNBkn69X + TV5fO5qRpLgnnC0E0gMumJepwBtZR3h + q6vcUK + xqjNXSYG9mz7Lz7c8H + / CLxuga76vL8hpbewbkynelveb + jywHQFemIoMl1HI6JOe5hh5 / P / 1Ecio5iPfnYlmr9M9nli2OsItIN00 =