亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

java加解密實(shí)例

mengera88 / 1621人閱讀

摘要:序本文主要小結(jié)一下里頭的以及加解密。屬于塊加密,塊加密中有等幾種工作模式。與一樣在加密前需要對(duì)數(shù)據(jù)進(jìn)行填充,不是很適合對(duì)流數(shù)據(jù)進(jìn)行加密。

本文主要小結(jié)一下java里頭的AES以及RSA加解密。

AES


使用AES加密時(shí)需要幾個(gè)參數(shù):

密鑰長(zhǎng)度(Key Size)

AES算法下,key的長(zhǎng)度有三種:128、192和256 bits。由于歷史原因,JDK默認(rèn)只支持不大于128 bits的密鑰,而128 bits的key已能夠滿(mǎn)足商用安全需求。

加密模式(Cipher Mode)

分組密碼算法只能加密固定長(zhǎng)度的分組,但是我們需要加密的明文長(zhǎng)度可能會(huì)超過(guò)分組密碼的分組長(zhǎng)度,這時(shí)就需要對(duì)分組密碼算法進(jìn)行迭代,以便將一段很長(zhǎng)的明文全部加密。而迭代的方法就稱(chēng)為分組密碼的模式。
AES屬于塊加密(Block Cipher),塊加密中有CBC、ECB、CTR、OFB、CFB等幾種工作模式。

ECB過(guò)于簡(jiǎn)單而不安全(ECB模式由于每塊數(shù)據(jù)的加密是獨(dú)立的因此加密和解密都可以并行計(jì)算,ECB模式最大的缺點(diǎn)是相同的明文塊會(huì)被加密成相同的密文塊,這種方法在某些環(huán)境下不能提供嚴(yán)格的數(shù)據(jù)保密性);

CFB可被施以重放攻擊;

OFB 和 CTR 都可被主動(dòng)攻擊者反轉(zhuǎn)密文,而引起解密后明文中的相應(yīng)比特也發(fā)生變化;CTR比之OFB,多出能支持并發(fā)計(jì)算的特性,此外CTR是流式密碼;

CBC雖不支持并行計(jì)算,但是卻是這些模式中最為安全的

本文使用CBC模式。

CBC模式對(duì)于每個(gè)待加密的密碼塊在加密前會(huì)先與前一個(gè)密碼塊的密文異或然后再用加密器加密。第一個(gè)明文塊與一個(gè)叫初始化向量的數(shù)據(jù)塊異或。CBC模式相比ECB有更高的保密性,但由于對(duì)每個(gè)數(shù)據(jù)塊的加密依賴(lài)與前一個(gè)數(shù)據(jù)塊的加密所以加密無(wú)法并行。與ECB一樣在加密前需要對(duì)數(shù)據(jù)進(jìn)行填充,不是很適合對(duì)流數(shù)據(jù)進(jìn)行加密。

填充方式(Padding)

由于塊加密只能對(duì)特定長(zhǎng)度的數(shù)據(jù)塊進(jìn)行加密,因此CBC、ECB模式需要在最后一數(shù)據(jù)塊加密前進(jìn)行數(shù)據(jù)填充。
JDK則提供了PKCS5Padding。

初始向量(Initialization Vector)

使用除ECB以外的其他加密模式均需要傳入一個(gè)初始向量,其大小與Block Size相等(AES的Block Size為128 bits)

生成AES KEY
public static String genKeyAES() throws Exception {
        KeyGenerator kenGen = KeyGenerator.getInstance(AES);
        kenGen.init(KEY_SIZE);
        SecretKey key = kenGen.generateKey();
        String base64 = Base64.getEncoder().encodeToString(key.getEncoded());
        return base64;
    }

這里KEY_SIZE采用128
后面統(tǒng)一用base64將byte[]轉(zhuǎn)為字符串,方便展示、排查。

加解密
public static byte[] aesEncryptBytes(byte[] contentBytes, byte[] keyBytes) throws Exception {
        return cipherOperation(contentBytes, keyBytes, Cipher.ENCRYPT_MODE);
    }

    public static byte[] aesDecryptBytes(byte[] contentBytes, byte[] keyBytes) throws Exception {
        return cipherOperation(contentBytes, keyBytes, Cipher.DECRYPT_MODE);
    }

    private static byte[] cipherOperation(byte[] contentBytes, byte[] keyBytes, int mode) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(keyBytes,AES);

        byte[] initParam = SIXTEEN_CHAR_INIT_VECTOR.getBytes(CHARSET);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

        Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5_PADDING);
        cipher.init(mode, secretKey, ivParameterSpec);

        return cipher.doFinal(contentBytes);
    }

這里AES_CBC_PKCS5_PADDING為AES/CBC/PKCS5Padding,使用簡(jiǎn)寫(xiě)的AES默認(rèn)就是這個(gè)值

RSA 生成密鑰對(duì)
public static KeyPair getKeyPair() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);
        keyPairGenerator.initialize(KEY_SIZE);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
    }

    public static String getPublicKey(KeyPair keyPair){
        PublicKey publicKey = keyPair.getPublic();
        byte[] bytes = publicKey.getEncoded();
        return Base64.getEncoder().encodeToString(bytes);
    }

    public static String getPrivateKey(KeyPair keyPair){
        PrivateKey privateKey = keyPair.getPrivate();
        byte[] bytes = privateKey.getEncoded();
        return Base64.getEncoder().encodeToString(bytes);
    }

這里KEY_SIZE用1024,RSA256,RSA512,RSA1024,RSA2048這四種,RSA后面的N代表位數(shù)(多少bit),位數(shù)越大,加密強(qiáng)度越大,需要破解需要的時(shí)間也就越長(zhǎng)

目前主流密鑰長(zhǎng)度至少都是1024bits以上,低于1024bit的密鑰已經(jīng)不建議使用(安全問(wèn)題)。那么上限在哪里?沒(méi)有上限,多大都可以使用。所以,主流的模值是1024位

加解密
public static byte[] publicEncrypt(byte[] content,PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE,publicKey);
        byte[] bytes = cipher.doFinal(content);
        return bytes;
    }

    public static byte[] privateDecrypt(byte[] content,PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.DECRYPT_MODE,privateKey);
        byte[] bytes = cipher.doFinal(content);
        return bytes;
    }

這里RSA即"RSA",默認(rèn)是RSA/ECB/PKCS1Padding

AES與RSA結(jié)合

RSA 比 AES 更難破解,因?yàn)樗恍枰獡?dān)心密鑰在傳遞過(guò)程中有泄露,只存在暴力破解一種可能;

AES的優(yōu)勢(shì)是以分組為輪,加解密速度非???,一般而言,AES 速度上數(shù)百倍于 RSA

在實(shí)際應(yīng)用中,我們會(huì)混合應(yīng)用AES和RSA:

1生成一個(gè)一次性隨機(jī)密鑰,算法上采用 AES 的CBC模式 aes-128-cbc(加密分組為128比特)對(duì)文件進(jìn)行加密

2加密完成后,為了安全的傳遞這個(gè)一次性隨機(jī)密鑰,我們使用接收方的RSA公鑰 對(duì)其進(jìn)行加密,隨加密后的文件一起發(fā)送

3接收方使用RSA私鑰進(jìn)行解密,得到AES密鑰原文,并用AES解密文件

這樣就充分利用了兩者的優(yōu)勢(shì).

public void testHyperCodec(){
        KeyPair keyPair = RSAUtil.getKeyPair();
        String pubKey = RSAUtil.getPublicKey(keyPair);
        String priKey = RSAUtil.getPrivateKey(keyPair);


        String password = "1234567890";

        String aesRawKey = AESUtil.genKeyAES();
        System.out.println("aes raw key:"+aesRawKey);

        String rsaEntryptAesKey = RSAUtil.publicEncryptString(aesRawKey,pubKey);
        System.out.println(rsaEntryptAesKey);
        String aesEntryptContent = AESUtil.aesEncryptStringByBase64Key(password,aesRawKey);
        System.out.println(aesEntryptContent);

        //decode
        String decodedAesKey = RSAUtil.privateDecryptString(rsaEntryptAesKey,priKey);
        String decodedPwd = AESUtil.aesDecryptStringByBase64Key(aesEntryptContent,decodedAesKey);

        System.out.println("aes key decoded:"+decodedAesKey);
        System.out.println(decodedPwd);
}
doc

AES加密 - iOS與Java的同步實(shí)現(xiàn)

對(duì)稱(chēng)加密、公鑰加密和RSA

數(shù)據(jù)傳輸加密——非對(duì)稱(chēng)加密算法RSA+對(duì)稱(chēng)算法AES(適用于java,android和Web)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70415.html

相關(guān)文章

  • SpringCloud(第 031 篇)配置客戶(hù)端ConfigClient鏈接經(jīng)過(guò)對(duì)稱(chēng)解密的配置微

    摘要:添加應(yīng)用啟動(dòng)類(lèi)配置客戶(hù)端鏈接經(jīng)過(guò)對(duì)稱(chēng)加解密的配置微服務(wù)專(zhuān)門(mén)為測(cè)試經(jīng)過(guò)對(duì)稱(chēng)加解密的配置微服務(wù)微服務(wù)模塊。 SpringCloud(第 031 篇)配置客戶(hù)端ConfigClient鏈接經(jīng)過(guò)對(duì)稱(chēng)加解密的配置微服務(wù) - 一、大致介紹 1、Git服務(wù)端的文件內(nèi)容進(jìn)行了加密處理,那么是不是配置客戶(hù)端拿到內(nèi)容之后需要解密呢? 2、答案顯然不是的,因?yàn)檫@樣解密的話(huà),先不說(shuō)實(shí)現(xiàn)起來(lái)的難易程度,單從表面...

    DDreach 評(píng)論0 收藏0
  • SpringCloud(第 033 篇)配置客戶(hù)端ConfigClient鏈接經(jīng)過(guò)對(duì)稱(chēng)解密的配置微

    SpringCloud(第 033 篇)配置客戶(hù)端ConfigClient鏈接經(jīng)過(guò)對(duì)稱(chēng)加解密的配置微服務(wù) - 一、大致介紹 1、在(第 031 篇)講解了如何鏈接對(duì)稱(chēng)加密的配置服務(wù)端,而鏈接對(duì)稱(chēng)非對(duì)稱(chēng)加密的配置微服務(wù)也是同樣的; 2、配置客戶(hù)端不需要做什么加解密的配置,加解密的配置在服務(wù)端做就好了; 3、這里還順便列舉下配置路徑的規(guī)則: /****************************...

    ARGUS 評(píng)論0 收藏0
  • 最新版-Python和Java實(shí)現(xiàn)Aes相互解密

    摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來(lái)的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。 前情 需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。 Python實(shí)現(xiàn) Python為3.6版...

    fox_soyoung 評(píng)論0 收藏0
  • 最新版-Python和Java實(shí)現(xiàn)Aes相互解密

    摘要:前情需要使用和實(shí)現(xiàn)同一個(gè)加解密算法,使版本加密的密文能夠由代碼解密,反之亦然。加密使用模式,需要一個(gè)向量,可增加加密算法的強(qiáng)度此處使用做轉(zhuǎn)碼。解密先用解密再將代碼加密出來(lái)的密鑰放到中進(jìn)行解密大功告成,實(shí)現(xiàn)了在和的互轉(zhuǎn)。 前情 需要使用Python和Java實(shí)現(xiàn)同一個(gè)AES加解密算法,使Python版本加密的密文能夠由Java代碼解密,反之亦然。 Python實(shí)現(xiàn) Python為3.6版...

    孫淑建 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Java實(shí)現(xiàn)Base64密》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期一說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。多用于網(wǎng)絡(luò)加密。散列函數(shù)函數(shù)或消息摘要函數(shù)主要作用散列函數(shù)用來(lái)驗(yàn)證數(shù)據(jù)的完整性。 時(shí)間:2017年4月10日星期一說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere...

    verano 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<