欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java實(shí)現(xiàn)aes代碼,AES代碼

java實(shí)現(xiàn)aes加密或者解密,不用工具包的怎么做

import?java.security.InvalidKeyException;

威遠(yuǎn)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

import?java.security.Key;

import?java.security.NoSuchAlgorithmException;

import?javax.crypto.*;??

import?javax.crypto.spec.*;??

/**

*?

*?@author?wchun

*?

*?AES128?算法,加密模式為ECB,填充模式為?pkcs7(實(shí)際就是pkcs5)

*?

*

*/

public?class?AES?{

static?final?String?algorithmStr="AES/ECB/PKCS5Padding";

static?private?KeyGenerator?keyGen;

static?private?Cipher?cipher;

static?boolean?isInited=false;

//初始化

static?private?void?init()

{

//初始化keyGen

try?{

keyGen=KeyGenerator.getInstance("AES");

}?catch?(NoSuchAlgorithmException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

keyGen.init(128);

//初始化cipher

try?{

cipher=Cipher.getInstance(algorithmStr);

}?catch?(NoSuchAlgorithmException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}?catch?(NoSuchPaddingException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

isInited=true;

}

public?static?byte[]?GenKey()

{

if(!isInited)//如果沒有初始化過,則初始化

{

init();

}

return?keyGen.generateKey().getEncoded();

}

public?static?byte[]?Encrypt(byte[]?content,byte[]?keyBytes)

{

byte[]?encryptedText=null;

if(!isInited)//為初始化

{

init();

}

Key?key=new?SecretKeySpec(keyBytes,"AES");

try?{

cipher.init(Cipher.ENCRYPT_MODE,?key);

}?catch?(InvalidKeyException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

try?{

encryptedText=cipher.doFinal(content);

}?catch?(IllegalBlockSizeException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}?catch?(BadPaddingException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

return?encryptedText;

}

//解密為byte[]

public?static?byte[]?DecryptToBytes(byte[]?content,byte[]?keyBytes)

{

byte[]?originBytes=null;

if(!isInited)

{

init();

}

Key?key=new?SecretKeySpec(keyBytes,"AES");

try?{

cipher.init(Cipher.DECRYPT_MODE,?key);

}?catch?(InvalidKeyException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

//解密

try?{

originBytes=cipher.doFinal(content);

}?catch?(IllegalBlockSizeException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}?catch?(BadPaddingException?e)?{

//?TODO?Auto-generated?catch?block

e.printStackTrace();

}

return?originBytes;

}

}

java如何用Aes加密和解密

你解密的key必須是加密的key啊

你看看,你解密的時(shí)候又KeyGenerator.getInstance("AES").generateKey();這是重新搞了一個(gè)key啊,當(dāng)然解不出來了

我估計(jì)你這代碼人家原先是寫在一起的吧,加密完了再直接解密給你看,人家只generateKey一次,自然很順利,你分成了兩個(gè)例子,居然分別generateKey,自然失敗

如何使用java對密碼加密 加密方式aes

Java有相關(guān)的實(shí)現(xiàn)類:具體原理如下

對于任意長度的明文,AES首先對其進(jìn)行分組,每組的長度為128位。分組之后將分別對每個(gè)128位的明文分組進(jìn)行加密。

對于每個(gè)128位長度的明文分組的加密過程如下:

(1)將128位AES明文分組放入狀態(tài)矩陣中。

(2)AddRoundKey變換:對狀態(tài)矩陣進(jìn)行AddRoundKey變換,與膨脹后的密鑰進(jìn)行異或操作(密鑰膨脹將在實(shí)驗(yàn)原理七中詳細(xì)討論)。

(3)10輪循環(huán):AES對狀態(tài)矩陣進(jìn)行了10輪類似的子加密過程。前9輪子加密過程中,每一輪子加密過程包括4種不同的變換,而最后一輪只有3種變換,前9輪的子加密步驟如下:

● SubBytes變換:SubBytes變換是一個(gè)對狀態(tài)矩陣非線性的變換;

● ShiftRows變換:ShiftRows變換對狀態(tài)矩陣的行進(jìn)行循環(huán)移位;

● MixColumns變換:MixColumns變換對狀態(tài)矩陣的列進(jìn)行變換;

● AddRoundKey變換:AddRoundKey變換對狀態(tài)矩陣和膨脹后的密鑰進(jìn)行異或操作。

最后一輪的子加密步驟如下:

● SubBytes變換:SubBytes變換是一個(gè)對狀態(tài)矩陣非線性的變換;

● ShiftRows變換:ShiftRows變換對狀態(tài)矩陣的行進(jìn)行循環(huán)移位;

● AddRoundKey變換:AddRoundKey變換對狀態(tài)矩陣和膨脹后的密鑰進(jìn)行異或操作;

(4)經(jīng)過10輪循環(huán)的狀態(tài)矩陣中的內(nèi)容就是加密后的密文。

AES的加密算法的偽代碼如下。

在AES算法中,AddRoundKey變換需要使用膨脹后的密鑰,原始的128位密鑰經(jīng)過膨脹會產(chǎn)生44個(gè)字(每個(gè)字為32位)的膨脹后的密鑰,這44個(gè)字的膨脹后的密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個(gè)字(128位)的膨脹后的密鑰。

三.AES的分組過程

對于任意長度的明文,AES首先對其進(jìn)行分組,分組的方法與DES相同,即對長度不足的明文分組后面補(bǔ)充0即可,只是每一組的長度為128位。

AES的密鑰長度有128比特,192比特和256比特三種標(biāo)準(zhǔn),其他長度的密鑰并沒有列入到AES聯(lián)邦標(biāo)準(zhǔn)中,在下面的介紹中,我們將以128位密鑰為例。

四.狀態(tài)矩陣

狀態(tài)矩陣是一個(gè)4行、4列的字節(jié)矩陣,所謂字節(jié)矩陣就是指矩陣中的每個(gè)元素都是一個(gè)1字節(jié)長度的數(shù)據(jù)。我們將狀態(tài)矩陣記為State,State中的元素記為Sij,表示狀態(tài)矩陣中第i行第j列的元素。128比特的明文分組按字節(jié)分成16塊,第一塊記為“塊0”,第二塊記為“塊1”,依此類推,最后一塊記為“塊15”,然后將這16塊明文數(shù)據(jù)放入到狀態(tài)矩陣中,將這16塊明文數(shù)據(jù)放入到狀態(tài)矩陣中的方法如圖2-2-1所示。

塊0

塊4

塊8

塊12

塊1

塊5

塊9

塊13

塊2

塊6

塊10

塊14

塊3

塊7

塊11

塊15

圖2-2-1 將明文塊放入狀態(tài)矩陣中

五.AddRoundKey變換

狀態(tài)矩陣生成以后,首先要進(jìn)行AddRoundKey變換,AddRoundKey變換將狀態(tài)矩陣與膨脹后的密鑰進(jìn)行按位異或運(yùn)算,如下所示。

其中,c表示列數(shù),數(shù)組W為膨脹后的密鑰,round為加密輪數(shù),Nb為狀態(tài)矩陣的列數(shù)。

它的過程如圖2-2-2所示。

圖2-2-2 AES算法AddRoundKey變換

六.10輪循環(huán)

經(jīng)過AddRoundKey的狀態(tài)矩陣要繼續(xù)進(jìn)行10輪類似的子加密過程。前9輪子加密過程中,每一輪要經(jīng)過4種不同的變換,即SubBytes變換、ShiftRows變換、MixColumns變換和AddRoundKey變換,而最后一輪只有3種變換,即SubBytes變換、ShiftRows變換和AddRoundKey變換。AddRoundKey變換已經(jīng)討論過,下面分別討論余下的三種變換。

1.SubBytes變換

SubBytes是一個(gè)獨(dú)立作用于狀態(tài)字節(jié)的非線性變換,它由以下兩個(gè)步驟組成:

(1)在GF(28)域,求乘法的逆運(yùn)算,即對于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。

(2)在GF(28)域做變換,變換使用矩陣乘法,如下所示:

由于所有的運(yùn)算都在GF(28)域上進(jìn)行,所以最后的結(jié)果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,則對于α∈GF(28),α≠0,則存在

β ∈ GF(28),使得:

β = gαmod(x8 + x4 + x3 + x + 1)

由于g255 = 1mod(x8 + x4 + x3 + x + 1)

所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)

根據(jù)SubBytes變換算法,可以得出SubBytes的置換表,如表2-2-1所示,這個(gè)表也叫做AES的S盒。該表的使用方法如下:狀態(tài)矩陣中每個(gè)元素都要經(jīng)過該表替換,每個(gè)元素為8比特,前4比特決定了行號,后4比特決定了列號,例如求SubBytes(0C)查表的0行C列得FE。

表2-2-1 AES的SubBytes置換表

它的變換過程如圖2-2-3所示。

圖2-2-3 SubBytes變換

AES加密過程需要用到一些數(shù)學(xué)基礎(chǔ),其中包括GF(2)域上的多項(xiàng)式、GF(28)域上的多項(xiàng)式的計(jì)算和矩陣乘法運(yùn)算等,有興趣的同學(xué)請參考相關(guān)的數(shù)學(xué)書籍。

2.ShiftRows變換

ShiftRows變換比較簡單,狀態(tài)矩陣的第1行不發(fā)生改變,第2行循環(huán)左移1字節(jié),第3行循環(huán)左移2字節(jié),第4行循環(huán)左移3字節(jié)。ShiftRows變換的過程如圖2-2-4所示。

圖2-2-4 AES的ShiftRows變換

3.MixColumns變換

在MixColumns變換中,狀態(tài)矩陣的列看作是域GF(28)的多項(xiàng)式,模(x4+1)乘以c(x)的結(jié)果:

c(x)=(03)x3+(01)x2+(01)x+(02)

這里(03)為十六進(jìn)制表示,依此類推。c(x)與x4+1互質(zhì),故存在逆:

d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)?d(x) = (D1)mod(x4+1)。

設(shè)有:

它的過程如圖2-2-5所示。

圖2-2-5 AES算法MixColumns變換

七.密鑰膨脹

在AES算法中,AddRoundKey變換需要使用膨脹后的密鑰,膨脹后的密鑰記為子密鑰,原始的128位密鑰經(jīng)過膨脹會產(chǎn)生44個(gè)字(每個(gè)字為32位)的子密鑰,這44個(gè)字的子密鑰供11次AddRoundKey變換使用,一次AddRoundKey使用4個(gè)字(128位)的膨脹后的密鑰。

密鑰膨脹算法是以字為基礎(chǔ)的(一個(gè)字由4個(gè)字節(jié)組成,即32比特)。128比特的原始密鑰經(jīng)過膨脹后將產(chǎn)生44個(gè)字的子密鑰,我們將這44個(gè)密鑰保存在一個(gè)字?jǐn)?shù)組中,記為W[44]。128比特的原始密鑰分成16份,存放在一個(gè)字節(jié)的數(shù)組:Key[0],Key[1]……Key[15]中。

在密鑰膨脹算法中,Rcon是一個(gè)10個(gè)字的數(shù)組,在數(shù)組中保存著算法定義的常數(shù),分別為:

Rcon[0] = 0x01000000

Rcon[1] = 0x02000000

Rcon[2] = 0x04000000

Rcon[3] = 0x08000000

Rcon[4] = 0x10000000

Rcon[5] = 0x20000000

Rcon[6] = 0x40000000

Rcon[7] = 0x80000000

Rcon[8] = 0x1b000000

Rcon[9] = 0x36000000

另外,在密鑰膨脹中包括其他兩個(gè)操作RotWord和SubWord,下面對這兩個(gè)操作做說明:

RotWord( B0,B1,B2,B3 )對4個(gè)字節(jié)B0,B1,B2,B3進(jìn)行循環(huán)移位,即

RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )

SubWord( B0,B1,B2,B3 )對4個(gè)字節(jié)B0,B1,B2,B3使用AES的S盒,即

SubWord( B0,B1,B2,B3 ) = ( B’0,B’1,B’2,B’3 )

其中,B’i = SubBytes(Bi),i = 0,1,2,3。

密鑰膨脹的算法如下:

八.解密過程

AES的加密和解密過程并不相同,首先密文按128位分組,分組方法和加密時(shí)的分組方法相同,然后進(jìn)行輪變換。

AES的解密過程可以看成是加密過程的逆過程,它也由10輪循環(huán)組成,每一輪循環(huán)包括四個(gè)變換分別為InvShiftRows變換、InvSubBytes變換、InvMixColumns變換和AddRoundKey變換;

這個(gè)過程可以描述為如下代碼片段所示:

九.InvShiftRows變換

InvShiftRows變換是ShiftRows變換的逆過程,十分簡單,指定InvShiftRows的變換如下。

Sr,(c+shift(r,Nb))modNb= Sr,c for 0 r 4 and 0 ≤ c Nb

圖2-2-6演示了這個(gè)過程。

圖2-2-6 AES算法InvShiftRows變換

十.InvSubBytes變換

InvSubBytes變換是SubBytes變換的逆變換,利用AES的S盒的逆作字節(jié)置換,表2-2-2為InvSubBytes變換的置換表。

表2-2-2 InvSubBytes置換表

十一.InvMixColumns變換

InvMixColumns變換與MixColumns變換類似,每列乘以d(x)

d(x) = (OB)x3 + (0D)x2 + (0G)x + (0E)

下列等式成立:

( (03)x3 + (01)x2 + (01)x + (02) )⊙d(x) = (01)

上面的內(nèi)容可以描述為以下的矩陣乘法:

十二.AddRoundKey變換

AES解密過程的AddRoundKey變換與加密過程中的AddRoundKey變換一樣,都是按位與子密鑰做異或操作。解密過程的密鑰膨脹算法也與加密的密鑰膨脹算法相同。最后狀態(tài)矩陣中的數(shù)據(jù)就是明文。

JAVA實(shí)現(xiàn)AES加密疑問么

和加密沒關(guān)系,SecureRandom是生成安全隨機(jī)數(shù)序列,password.getBytes()是種子,只要種子相同,序列就一樣,所以解密只要有password就行,可以復(fù)原這個(gè)序列

請教個(gè)關(guān)于Java實(shí)現(xiàn)AES加解密的問題

JDK對DESede算法的支持

密鑰長度:128位

工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128

填充方式:Nopadding/PKCS5Padding/ISO10126Padding/

AES加密解密的java實(shí)現(xiàn):

package com.kongxincai.encanddec;import java.security.Key;import java.security.NoSuchAlgorithmException;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESCoder { ? private static final String KEY_ALGORITHM = "AES"; ? private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//默認(rèn)的加密算法

public static byte[] initSecretKey() { ? ? ? //返回生成指定算法密鑰生成器的 KeyGenerator 對象

KeyGenerator kg = null; ? ? ? try {

kg = KeyGenerator.getInstance(KEY_ALGORITHM);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace(); ? ? ? ? ? return new byte[0];

} ? ? ? //初始化此密鑰生成器,使其具有確定的密鑰大小 ? ? ? //AES 要求密鑰長度為 128

kg.init(128); ? ? ? //生成一個(gè)密鑰

SecretKey ?secretKey = kg.generateKey(); ? ? ? return secretKey.getEncoded();

} ? private static Key toKey(byte[] key){ ? ? ? //生成密鑰

return new SecretKeySpec(key, KEY_ALGORITHM);

} ? public static byte[] encrypt(byte[] data,Key key) throws Exception{ ? ? ? return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

} ? public static byte[] encrypt(byte[] data,byte[] key) throws Exception{ ? ? ? return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

} ? public static byte[] encrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{ ? ? ? //還原密鑰

Key k = toKey(key); ? ? ? return encrypt(data, k, cipherAlgorithm);

} ? public static byte[] encrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{ ? ? ? //實(shí)例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm); ? ? ? //使用密鑰初始化,設(shè)置為加密模式 ? ? ? cipher.init(Cipher.ENCRYPT_MODE, key); ? ? ? //執(zhí)行操作

return cipher.doFinal(data);

} ? public static byte[] decrypt(byte[] data,byte[] key) throws Exception{ ? ? ? return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

} ? public static byte[] decrypt(byte[] data,Key key) throws Exception{ ? ? ? return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM);

} ? public static byte[] decrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{ ? ? ? //還原密鑰

Key k = toKey(key); ? ? ? return decrypt(data, k, cipherAlgorithm);

} ? public static byte[] decrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{ ? ? ? //實(shí)例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm); ? ? ? //使用密鑰初始化,設(shè)置為解密模式 ? ? ? cipher.init(Cipher.DECRYPT_MODE, key); ? ? ? //執(zhí)行操作

return cipher.doFinal(data);

} ? private static String ?showByteArray(byte[] data){ ? ? ? if(null == data){ ? ? ? ? ? return null;

}

StringBuilder sb = new StringBuilder("{"); ? ? ? for(byte b:data){

sb.append(b).append(",");

}

sb.deleteCharAt(sb.length()-1);

sb.append("}"); ? ? ? return sb.toString();

} ? public static void main(String[] args) throws Exception { ? ? ? byte[] key = initSecretKey();

System.out.println("key:"+showByteArray(key));

Key k = toKey(key); //生成秘鑰

String data ="AES數(shù)據(jù)";

System.out.println("加密前數(shù)據(jù): string:"+data);

System.out.println("加密前數(shù)據(jù): byte[]:"+showByteArray(data.getBytes()));

System.out.println(); ? ? ? byte[] encryptData = encrypt(data.getBytes(), k);//數(shù)據(jù)加密

System.out.println("加密后數(shù)據(jù): byte[]:"+showByteArray(encryptData));// ? ? ? System.out.println("加密后數(shù)據(jù): hexStr:"+Hex.encodeHexStr(encryptData)); ? ? ? System.out.println(); ? ? ? byte[] decryptData = decrypt(encryptData, k);//數(shù)據(jù)解密

System.out.println("解密后數(shù)據(jù): byte[]:"+showByteArray(decryptData));

System.out.println("解密后數(shù)據(jù): string:"+new String(decryptData));

}

}

JAVA如何AES和DES加密

public?class?DESCoder?{

public?static?byte[]?decodeBase64(String?data)?throws?Exception{

return?new?BASE64Decoder().decodeBuffer(data);

}

public?static?String?encodeBase64(byte[]?key)?throws?Exception{

return?new?BASE64Encoder().encodeBuffer(key);

}

/**

*?生成密鑰

*?@param?seed

*?@return

*?@throws?Exception

*/

public?static?String?initKey(String?seed)?throws?Exception{

SecureRandom?secureRandom?=?null;

if(seed?!=?null){

secureRandom?=?new?SecureRandom(decodeBase64(seed));

}else{

secureRandom?=?new?SecureRandom();

}

KeyGenerator?kg?=?KeyGenerator.getInstance("DES");

kg.init(secureRandom);

SecretKey?key?=?kg.generateKey();

return?encodeBase64(key.getEncoded());

}

/**

*?轉(zhuǎn)換成密鑰

*?@param?key

*?@return

*?@throws?Exception

*/

public?static?Key?toKey(byte[]?key)?throws?Exception{

DESKeySpec?dks?=?new?DESKeySpec(key);

SecretKeyFactory?keyFactory?=?SecretKeyFactory.getInstance("DES");

SecretKey?secretKey?=?keyFactory.generateSecret(dks);

//?當(dāng)使用其他對稱加密算法時(shí),如AES、Blowfish等算法時(shí),用下述代碼替換上述三行代碼??

//?SecretKey?secretKey?=?new?SecretKeySpec(key,?"AES");??

return?secretKey;

}

/**

*?加密

*?@param?data

*?@param?key

*?@return

*?@throws?Exception

*/

public?static?byte[]?encrypt(byte[]?data,String?key)?throws?Exception{

Key?k?=?toKey(decodeBase64(key));

Cipher?cipher?=?Cipher.getInstance("DES");

cipher.init(Cipher.ENCRYPT_MODE,?k);

return?cipher.doFinal(data);

}

/***

*?解密?

*?@param?data

*?@param?key

*?@return

*?@throws?Exception

*/

public?static?byte[]?decrypt(byte[]?data,String?key)?throws?Exception{

Key?k?=?toKey(decodeBase64(key));

Cipher?cipher?=?Cipher.getInstance("DES");

cipher.init(Cipher.DECRYPT_MODE,?k);

return?cipher.doFinal(data);

}

public?static?void?main(String[]?args)?throws?Exception{

System.out.println(initKey(null));

String?txt?=?"abc";

String?key?=?initKey(null);

byte[]?data?=?encrypt(txt.getBytes(),key);

System.out.println(new?String(encodeBase64(data)));

byte[]?output?=?decrypt(data,key);

System.out.println(new?String(output));

}

}

分享標(biāo)題:java實(shí)現(xiàn)aes代碼,AES代碼
分享鏈接:http://chinadenli.net/article19/dsgijgh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)ChatGPT網(wǎng)站導(dǎo)航全網(wǎng)營銷推廣微信公眾號域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管