RSA復号前端と後端

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 =

おすすめ

転載: www.cnblogs.com/heyf/p/11206217.html