免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Java與C++通過CBC、blowfish互相加解密


在簡單的服務(wù)器端與客戶端通信的應(yīng)用中,這種做法比較常見

DES、blowfish掃盲:

1.des的常見模式分為四種 ECB / CBC / CFB / OFB     這里使用默認(rèn)的ECB

ECB的缺陷:能從密文看出明文的規(guī)律

加密算法是按塊進行加密的, DES ,是 64Bit 一個塊的進行加密,就是每次加密 8 個字節(jié),因此每次輸入八個字節(jié)的明文輸出八個字節(jié)密文,如果是 16 個字節(jié),那么分成兩個塊依次進行加密,問題就出現(xiàn)在這里,如果明文是 1234567812345678,分塊分別進行加密,那么加密的結(jié)果類似“C4132737962C519C C4132737962C519C”,可以看出明文的規(guī)律,這就是 ECB 加密模式,密文可以看出明文的規(guī)律

CBC/CFB/OFB:

為了解決這個問題,有了其他的加密模式:CBC 加密模式(密碼分組連接),CFB加密模式(密碼反饋模式),OFB加密模式(輸出反饋模式)CBC 是要求給一個初始化的向量,然后將每個輸出與該向量作運算,并將運算的結(jié)果作為下一個加密塊的初始化向量,CFB 和 OFB 則不需要提供初始化向量,直接將密碼或者輸出作為初始化向量進行運算;這樣就避免了明文的規(guī)律出現(xiàn)在密文中;當(dāng)然缺點是解密時需要保證密文的正確性,如果網(wǎng)絡(luò)傳輸時發(fā)生了一部分錯誤,則后面的解密結(jié)果就可能是錯誤的;(ECB模式僅影響傳輸錯誤的那個塊);

2.上面提到des是以64bit作為單位塊單位來進行加密的,如果加密的內(nèi)容長度剛好不是64bit塊的倍數(shù),則需要做填充(padding)

常用的填充算法是 PKCS#7,該填充方法是將每一個補充的字節(jié)內(nèi)容填充為填充的字節(jié)個數(shù);例如明文長度是 100 , 分組的大小是32個字節(jié),那么需要分為四組,補充28個字節(jié),那么補充的字節(jié)全部補充為'\0x28',如果分組的大小是 8 個字節(jié),那么 PKCS#7 的填充方式和 PKCS#5 是完全一致的;另外還有一個規(guī)定,就是如果明文剛剛好進行分組,那么需要補充一個獨立的分組出來,例如 DES ,如果明文為 8 個字節(jié),那么需要補充為 16 個字節(jié)進行運算,這樣的好處是進行解密后,將解密出來的最后一個字節(jié)取出來,并將解密結(jié)果的長度減去該值,就是原來明文的長度;

當(dāng)然你也可以選擇NoPadding模式,自己對加密內(nèi)容的字節(jié)數(shù)做處理,確保它的長度是64bit的倍數(shù)

(以上規(guī)則blowfish也同樣使用)

代碼:

java

01<b>import java.security.Key;
02import java.security.Security;
03import javax.crypto.Cipher;
04 
05public class DESPlus
06{
07 static String strDefaultKey = "initkey";
08 static Cipher encryptCipher = null;
09 static Cipher decryptCipher = null;
10  
11 static {
12     Security.addProvider(new com.sun.crypto.provider.SunJCE());
13     Key key = null;
14    try {
15      key = getKey(strDefaultKey.getBytes());
16      encryptCipher = Cipher.getInstance("DES");
17      encryptCipher.init(Cipher.ENCRYPT_MODE, key);
18 
19      decryptCipher = Cipher.getInstance("DES");
20      decryptCipher.init(Cipher.DECRYPT_MODE, key);
21    }catch(Exception e){
22        e.printStackTrace();
23        }
24    }
25 
26 public DESPlus(){
27 }
28 
29 public static byte[] encrypt(byte[] arrB) throws Exception {
30  return encryptCipher.doFinal(arrB);
31 }
32 
33 public static byte[] decrypt(byte[] arrB) throws Exception {
34  return decryptCipher.doFinal(arrB);
35 }
36 
37 private static  Key getKey(byte[] arrBTmp) throws Exception {
38  byte[] arrB = new byte[8];
39  for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
40   arrB[i] = arrBTmp[i];
41  }
42  Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
43  return key;
44 }
45  
46}</b>
c++
01int Encrypt( unsigned char * inbuf , unsigned char * * outbuf , int inlen , unsigned char * key, unsigned char * iv )
02{
03    BIO *bio, *mbio, *cbio;
04    unsigned char *dst;
05    int outlen;
06 
07    mbio = BIO_new( BIO_s_mem( ) );
08    cbio = BIO_new( BIO_f_cipher( ) );
09    BIO_set_cipher( cbio , EVP_des_cbc( ) , key , iv , 1 );
10 
11    bio = BIO_push( cbio , mbio );
12    BIO_write( bio , inbuf , inlen );
13    BIO_flush( bio );
14 
15    outlen = BIO_get_mem_data( mbio , (unsigned char **) & dst );
16    * outbuf = ( unsigned char * ) malloc( outlen );
17    memcpy( * outbuf , dst , outlen );
18    BIO_free_all( bio );
19 
20    return outlen;
21}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
3DES的CBC加密模式
openssl之a(chǎn)es加密 cbc方式與實現(xiàn)案例
openssl之EVP系列之4---EVP_Encrypt系列
DES加密、解密字符串算法(java版)
加密
Java DES,DESede,Blowfish非對稱加密實現(xiàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服