日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android平台和java平台 DES加密解密互通程序及其不能互通的原因

發布時間:2025/3/8 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android平台和java平台 DES加密解密互通程序及其不能互通的原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

網上的demo一搜一大堆,但是,基本上都是一知半解(包括我)。為什么呢?我在嘗試分別在兩個平臺加密的時候,竟然發現Android DES 加密和Java DES加密的程序不能互通。就是加密的結果不一樣,更不要說Android平臺的加密輸入作為java DES的解密輸出了。這樣的話,客戶端和服務器端就不能進行通信了。我網上之前也發帖子問了不少人,但是回答都不滿意。

今天部門的另外一個同事跟我說了一下,才解決了這個不能互通的問題。

調用DES加密算法包最精要的就是下面兩句話:

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);

CBC是工作模式,DES一共有電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種模式,

PKCS5Padding是填充模式,還有其它的填充模式:

然后,cipher.init()一共有三個參數:Cipher.ENCRYPT_MODE, key, zeroIv,zeroIv就是初始化向量,一個8為字符數組。

工作模式、填充模式、初始化向量這三種因素一個都不能少。否則,如果你不指定的話,那么就要程序就要調用默認實現。問題就來了,這就與平臺有關了。難怪網上一搜"DES加密結果不一致“,出現n多網頁結果。(之前我并沒有指定IV,被折磨了2周)

源程序如下(從java平臺到android平臺,我根本沒有更改一行代碼):

另外,一般情況下,加密后的結果都會用base64編碼進行傳輸。

java平臺:

主程序

public?class?testDES?{??/**?*?@param?args?*?@throws?Exception??*/??public?static?void?main(String[]?args)?throws?Exception?{??//?TODO?Auto-generated?method?stub??String?key?=?"12345678";??String?text?=?"12345678";??String?result1?=?DES.encryptDES(text,key);??String?result2?=?DES.decryptDES(result1,?key);??System.out.println(result1);??System.out.println(result2);??}?? }

用到的DES加密類

import?javax.crypto.Cipher;?? import?javax.crypto.spec.IvParameterSpec;?? import?javax.crypto.spec.SecretKeySpec; public?class?DES?{??private?static?byte[]?iv?=?{1,2,3,4,5,6,7,8};??public?static?String?encryptDES(String?encryptString,?String?encryptKey)?throws?Exception?{?? //??????IvParameterSpec?zeroIv?=?new?IvParameterSpec(new?byte[8]);??IvParameterSpec?zeroIv?=?new?IvParameterSpec(iv);??SecretKeySpec?key?=?new?SecretKeySpec(encryptKey.getBytes(),?"DES");??Cipher?cipher?=?Cipher.getInstance("DES/CBC/PKCS5Padding");??cipher.init(Cipher.ENCRYPT_MODE,?key,?zeroIv);??byte[]?encryptedData?=?cipher.doFinal(encryptString.getBytes());??return?Base64.encode(encryptedData);??}??public?static?String?decryptDES(String?decryptString,?String?decryptKey)?throws?Exception?{??byte[]?byteMi?=?new?Base64().decode(decryptString);??IvParameterSpec?zeroIv?=?new?IvParameterSpec(iv);?? //??????IvParameterSpec?zeroIv?=?new?IvParameterSpec(new?byte[8]);??SecretKeySpec?key?=?new?SecretKeySpec(decryptKey.getBytes(),?"DES");??Cipher?cipher?=?Cipher.getInstance("DES/CBC/PKCS5Padding");??cipher.init(Cipher.DECRYPT_MODE,?key,?zeroIv);??byte?decryptedData[]?=?cipher.doFinal(byteMi);??return?new?String(decryptedData);??}?? }

用到的BASE64工具類:

import?java.io.ByteArrayOutputStream;?? import?java.io.IOException;?? import?java.io.OutputStream;??public?class?Base64?{??private?static?final?char[]?legalChars?=?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();??/**?*?data[]進行編碼?*?@param?data?*?@return?*/??public?static?String?encode(byte[]?data)?{??int?start?=?0;??int?len?=?data.length;??StringBuffer?buf?=?new?StringBuffer(data.length?*?3?/?2);??int?end?=?len?-?3;??int?i?=?start;??int?n?=?0;??while?(i?<=?end)?{??int?d?=?((((int)?data[i])?&?0x0ff)?<<?16)??|?((((int)?data[i?+?1])?&?0x0ff)?<<?8)??|?(((int)?data[i?+?2])?&?0x0ff);??buf.append(legalChars[(d?>>?18)?&?63]);??buf.append(legalChars[(d?>>?12)?&?63]);??buf.append(legalChars[(d?>>?6)?&?63]);??buf.append(legalChars[d?&?63]);??i?+=?3;??if?(n++?>=?14)?{??n?=?0;??buf.append("?");??}??}??if?(i?==?start?+?len?-?2)?{??int?d?=?((((int)?data[i])?&?0x0ff)?<<?16)??|?((((int)?data[i?+?1])?&?255)?<<?8);??buf.append(legalChars[(d?>>?18)?&?63]);??buf.append(legalChars[(d?>>?12)?&?63]);??buf.append(legalChars[(d?>>?6)?&?63]);??buf.append("=");??}?else?if?(i?==?start?+?len?-?1)?{??int?d?=?(((int)?data[i])?&?0x0ff)?<<?16;??buf.append(legalChars[(d?>>?18)?&?63]);??buf.append(legalChars[(d?>>?12)?&?63]);??buf.append("==");??}??return?buf.toString();??}??private?static?int?decode(char?c)?{??if?(c?>=?'A'?&&?c?<=?'Z')??return?((int)?c)?-?65;??else?if?(c?>=?'a'?&&?c?<=?'z')??return?((int)?c)?-?97?+?26;??else?if?(c?>=?'0'?&&?c?<=?'9')??return?((int)?c)?-?48?+?26?+?26;??else??switch?(c)?{??case?'+':??return?62;??case?'/':??return?63;??case?'=':??return?0;??default:??throw?new?RuntimeException("unexpected?code:?"?+?c);??}??}??/**?*?Decodes?the?given?Base64?encoded?String?to?a?new?byte?array.?The?byte?*?array?holding?the?decoded?data?is?returned.?*/??public?static?byte[]?decode(String?s)?{??ByteArrayOutputStream?bos?=?new?ByteArrayOutputStream();??try?{??decode(s,?bos);??}?catch?(IOException?e)?{??throw?new?RuntimeException();??}??byte[]?decodedBytes?=?bos.toByteArray();??try?{??bos.close();??bos?=?null;??}?catch?(IOException?ex)?{??System.err.println("Error?while?decoding?BASE64:?"?+?ex.toString());??}??return?decodedBytes;??}??private?static?void?decode(String?s,?OutputStream?os)?throws?IOException?{??int?i?=?0;??int?len?=?s.length();??while?(true)?{??while?(i?<?len?&&?s.charAt(i)?<=?'?')??i++;??if?(i?==?len)??break;??int?tri?=?(decode(s.charAt(i))?<<?18)??+?(decode(s.charAt(i?+?1))?<<?12)??+?(decode(s.charAt(i?+?2))?<<?6)??+?(decode(s.charAt(i?+?3)));??os.write((tri?>>?16)?&?255);??if?(s.charAt(i?+?2)?==?'=')??break;??os.write((tri?>>?8)?&?255);??if?(s.charAt(i?+?3)?==?'=')??break;??os.write(tri?&?255);??i?+=?4;??}??}??}

adnroid平臺的主函數:

public?class?main?extends?Activity?{??/**?Called?when?the?activity?is?first?created.?*/??@Override??public?void?onCreate(Bundle?savedInstanceState)?{??super.onCreate(savedInstanceState);??setContentView(R.layout.main);??String?key?=?"12345678";??String?text?=?"12345678";??try?{??String?result1?=?DES.encryptDES(text,key);??String?result2?=?DES.decryptDES(result1,?key);??Log.i("DES?encode?text?is?",?result1);??Log.i("DES?encode?text?is?",?result2);??}?catch?(Exception?e)?{??//?TODO?Auto-generated?catch?block??e.printStackTrace();??}??????}?? }


通過查看log日志就可以看到結果。

兩個平臺的結果是一樣的,都是:

加密結果:X2p9Uo45Tzk6Ntu6W7Ev+Q==
解密結果:12345678


轉載于:https://my.oschina.net/csmw00/blog/671363

總結

以上是生活随笔為你收集整理的Android平台和java平台 DES加密解密互通程序及其不能互通的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。