ase加密放linux報錯_解決Linux下AES解密失敗

前段時間,用了個AES加密解密的方法,詳見上篇博客AES加密解密。

加解密方法在window上測試的時候沒有出現不論什么問題。將加密過程放在安卓上。解密公布到Linuxserver的時候,安卓將加密的結果傳到Linux上解密的時候卻總是失敗,讓用戶不能成功登錄。經過檢查,測試后。發現AES在Linux上解密失敗,出現錯誤:

javax.crypto.BadPaddingException: Given final block not properly padded

如今來回想下自己的解決思路:

加密過程是在安卓上,解密是在Linu上,會不會是由于環境的不同,在加密過程中產生的二進制和在解密過程中產生的二進制不一樣呢?但是在經過聯調后,比對二進制。發現沒有問題。那問題是在哪里呢?

繼續聯調, 細致比對加密和解密過程中每一步產生的結果。發現了問題:

Linux解密端:

發現這里的cipher下的 firstService是有值的。

安卓加密端:

發現這里的cipher下的 firstService是沒有值的。

百度后發現:

加密解密方法的唯一區別是Cipher對象的模式不一樣,這就排除了程序寫錯的可能性。

由于錯誤信息是在宜昌中出現的。其大概意思是:提供的字塊不符合填補的。什么意思呢?原來在用加密的時候,最后一位長度不足,它會自己主動補足,那么在我們進行字節數組到字串的轉化過程中,能夠把它填補的不可見字符改變了。所以系統拋出異常。

問題找到,怎么解決呢?方式例如以下:

package ICT.base.rest.services.app;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

public class AESDecodeUtils {

public static void main(String[] args) {

String content = "g25";

String pwd = "8182838485";

String addPwd = "123456";

// 加密

System.out.println("加密前content:" + content);

byte[] enAccount = encrypt(content, addPwd);

byte[] enPwd = encrypt(pwd, addPwd);

String encryptResultStr = parseByte2HexStr(enAccount);

String parseByte2HexStr2 = parseByte2HexStr(enPwd);

System.out.println("加密后content:" + encryptResultStr);

// 解密 ——賬號/身份證號

byte[] accountFrom = AESDecodeUtils.parseHexStr2Byte(encryptResultStr);

byte[] deAccount = AESDecodeUtils.decrypt(accountFrom, addPwd);

String userAccount = new String(deAccount);

System.out.println("解密后content:" + userAccount);

// 解密——密碼

byte[] pwdFrom = AESDecodeUtils.parseHexStr2Byte(parseByte2HexStr2);

byte[] deUserPwd = AESDecodeUtils.decrypt(pwdFrom, addPwd);

String userPwd = new String(deUserPwd);

// System.out.println(userPwd);

}

/**

* AES加密

*

* @param content

* 要加密的內容

* @param password

* 加密使用的密鑰

* @return 加密后的字節數組

*/

public static byte[] encrypt(String content, String password) {

SecureRandom random = null;

try {

random = SecureRandom.getInstance("SHA1PRNG");

random.setSeed(password.getBytes());

} catch (NoSuchAlgorithmException e1) {

e1.printStackTrace();

}

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

// kgen.init(128, new SecureRandom(password.getBytes()));

kgen.init(128, random);

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");// 創建密碼器

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(byteContent);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 將二進制轉換成16進制 加密

*

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 解密

*

* @param content

* 待解密內容

* @param password

* 解密密鑰

* @return

*/

public static byte[] decrypt(byte[] content, String password) {

SecureRandom random = null;

try {

random = SecureRandom.getInstance("SHA1PRNG");

random.setSeed(password.getBytes());

} catch (NoSuchAlgorithmException e1) {

e1.printStackTrace();

}

try {

KeyGenerator kgen = KeyGenerator.getInstance("AES");

// kgen.init(128, new SecureRandom(password.getBytes()));

kgen.init(128, random);

SecretKey secretKey = kgen.generateKey();

byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");// 創建密碼器

cipher.init(Cipher.DECRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(content);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

/**

* 將16進制轉換為二進制

*

* @param hexStr

* @return

*/

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),

16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

}

執行結果:

將加密放到安卓端。解密放大Linux上后,例如以下:

此時cipher下的 firstService不再是Null,都有了值

安卓加密端:

Linux解密端:

總結:

AES是對稱加密,解密端改變解密過程。相同,加密端的加密過程也會改變。無論怎么著,調程序還是得要有耐心。用一個東西,其簡單主要的原理還是要知道的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529451.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機專業接本應用心理學,專接本接應用心理學但遇到阻撓?

沫沫累計幫助了30人我也是學心理的&#xff0c;學姐你好選專業這件事情&#xff0c;有的放棄自己的意愿&#xff0c;走上了不喜歡的那條路&#xff0c;最后結果對自己來說無論如何都是苦的。有的人跟隨了自己的意愿&#xff0c;最后結果不好的 又會埋怨父母當初為什么不加以阻攔…

大學計算機一級word,大學計算機基礎一級考試復習資料

大學計算機基礎一級考試復習資料判斷題1. 在Word字體對話框中&#xff0c;選擇中文字號越大&#xff0c;實際的字就越大。 答案&#xff1a;錯2. 在Excel中&#xff0c;一個工作表可以包含多個工作簿。 答案&#xff1a;錯3. 在Word中&#xff0c;圖像只能從系統內置的剪輯庫中…

計算機程序大賽編程,【小學組】海淀區第三屆“智慧杯”中小學生計算機程序設計大賽編程思維類初賽...

強密碼描述我們稱一個密碼是強密碼&#xff0c;當且僅當它滿足以下所有條件&#xff1a;由 8 ? 16 個字符組成至少包含一個大寫字母 (A-Z)至少包含一個小寫字母 (a-z)至少包含一個數字 (0-9)至少包含一個特殊符號 (! # $ % & * _ )嬌嬌發現她現在的密碼好像不是強密碼&am…

linux send 失敗_Epoll學習服務器的實現-Linux內核原始Epoll結構

1.Begins~有的人學習linux編程很久&#xff0c;只知道網絡編程是socket&#xff0c;bind&#xff0c; listen。。。&#xff0c;然而這些都是網絡通信軟件最基本的接口。在某網絡公司待了y&#xff0c;也了解到公司的基礎就是網絡轉發 &#xff0c;然而網絡轉發實現并非我們平時…

衛生系統計算機考試內容,2021年衛生資格考試題型是什么樣的?一篇搞懂!

根據中國衛生人才網發布的考試通知可知&#xff0c;2021年衛生資格考試除護理學初級(師)專業采用紙筆作答方式進行考試外&#xff0c;其余116個專業均采用人機對話方式進行。那么&#xff0c;什么是人機考試呢&#xff1f;能提前練習嗎&#xff1f;為了解決大家的疑惑&#xff…

市面上有哪幾種門_選擇 low-e門窗玻璃,你想知道的都在這了

最近系統門窗群里&#xff0c;不少讀者粉絲在咨詢關于Low-e玻璃的問題&#xff0c;大家越來越重視好的門窗對于隔熱、隔音、隔輻射的作用。我匯總了群里大家咨詢最多的20個問題&#xff0c;希望對大家在挑選門窗玻璃時起到一些幫助。在介紹low-e玻璃前&#xff0c;大家先跟著我…

計算機進制簡稱,NO.A.0007——二進制;計算機容量單位B、KB、MB、GB和TB關系

一、字節(Byte,簡稱B)與K、KB、M、MB的關系1、計算機中各種存儲容量的單位都是用字節(Byte簡為B)來表示&#xff0c;此外還有KB、MB、GB和TB&#xff0c;他們的關系是&#xff1a;1KB1024Bytes2的10次方Bytes1MB1024KB2的20次方Bytes1GB1024MB2的30次方Bytes1TB1024GB2的40次方…

arm中斷保護和恢復_嵌入式ARM系統異常和中斷處理知識總結

關于異常處理&#xff0c;分為三部分&#xff1a; 1. ARM異常和模式&#xff1a;core處理異常時的操作&#xff0c;幾種模式介紹。 2. Vector table&#xff1a; 3. 異常優先級 4. lr偏移&#xff1a;幾種異常如何返回異常和中斷處理簡介在嵌入式系統中異常處理是核心之一。高效…

計算機工作站 曙光,曙光桌面工作站解析

曙光桌面工作站內部架構從整個結構設計來看&#xff0c;整機采用10升小機箱設計&#xff0c;尺寸為326x90x333.4mm&#xff0c;重量在5KG左右&#xff1b;支持垂直放置或橫置&#xff0c;節省辦公空間。接口方面&#xff0c;整機在前面板提供了4個USB 3.0接口&#xff0c;后置接…

查看網卡命令 uefi_大神教你開機進入UEFI模式的方法,非常簡單

啟動電腦時&#xff0c;如果要更改啟動優先級、啟用或禁用安全啟動或更改任何其他低級設置&#xff0c;則需要啟動到UEFI模式。根據主板制造商的不同&#xff0c;必須按鍵盤上的特定鍵或組合鍵才能進入UEFI模式。盡管初始屏幕顯示了需要按下的鍵&#xff0c;但對于初學者來說卻…

計算機網絡拓撲結構說課稿,計算機網絡應用基礎說課稿修稿稿

計算機網絡應用基礎說課稿修稿稿 (6頁)本資源提供全文預覽&#xff0c;點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧&#xff0c;查找使用更方便哦&#xff01;19.90 積分計算機網絡的分類說課稿第1頁共6頁計算機網絡的分類說課稿蓬溪縣中等職業技術學校唐湘各位評委老師大家…

擴展源_瑞薩電子推出具備反向充電WattShare TRx模式的 15W無線充電電源P9415R接收器,擴展無線電源產品線...

News全球領先的半導體解決方案供應商瑞薩電子集團(TSE&#xff1a;6723)日前宣布推出采用瑞薩獨有WattShareTM技術的P9415-R無線電源接收器&#xff0c;作為其無線電源解決方案的最新成員。新型15W無線電源接收器使智能手機、移動電源以及便攜式工業和醫療設備能夠對其它具有無…

香港大學計算機碩士一定要面試嗎,大干貨!!!香港碩士有哪些專業需要筆試面試...

和其它英聯邦地區比&#xff0c;香港碩士申請復雜程度更高&#xff0c;除了香港地區不同專業在申請時間、流程及錄取要求方面的復雜信息外&#xff0c;很多專業在錄取時都有面試筆試也是很重要的原因。很多同學在收到面試筆試后也都會擔心自己表現不好被拒。今天就來跟大家說說…

計算機上沒有office2010,《我安裝了office2010,為什么桌面-右鍵-新建中沒有excel呢?》 excel文件找不到...

為什么在excel2007中新建文檔&#xff0c;我的模板里找不到剛剛保存的模板&#xff1f;win10系統/華碩S CA400&#xff1a;C:\Users\Admin\AppData\Roaming\Microsoft\Templates我安裝了office2010&#xff0c;為什么桌面-右鍵-新建中沒有excel呢&#xff1f;這個office2010無關…

postgresql存圖片字段類型_PostgreSQL 入門

安裝、設置、創建和開始使用 PostgreSQL 數據庫。-- Greg Pittman&#xff08;作者&#xff09;每個人或許都有需要在數據庫中保存的東西。即使你執著于使用紙質文件或電子文件&#xff0c;它們也會變得很麻煩。紙質文檔可能會丟失或混亂&#xff0c;你需要訪問的電子信息可能會…

ibm服務器 p5 硬盤,IBM虛擬化實戰之p5服務器邏輯分區解讀

創建 AIX 分區現在您將創建一個 AIX 分區&#xff0c;它使用 VIO Server 的 SEA 來訪問網絡。它還將其 rootvg 寄宿在 VIO LPAR 上。創建 AIX 服務器分區和概要除了下面的變化以外&#xff0c;創建 AIX 分區和概要的步驟與創建VIO Server 分區和概要部分中的步驟完全相同。1. 在…

cad動態塊制作翻轉_裝X必學,手把手教你做CAD動態屬性塊

最近很多粉絲后臺問熊大&#xff0c;如何制作CAD動態屬性塊&#xff0c;這個問題把我難到了。因為這個不是一句兩句話能夠說得清楚的&#xff0c;于是我拿出珍藏的“西蜀鄙夫”寫的教程&#xff0c;并通過與我們設計過程的實際需要給大家說說。干貨文章&#xff0c;大家耐心看完…

云服務器怎么執行sql文件在哪里,總結帝國CMS下在PHP文件中怎么調用數據庫類執行SQL語句實例...

總結帝國CMS下在PHP文件中怎么調用數據庫類執行SQL語句實例發布時間&#xff1a;2020-10-19 14:58:08來源&#xff1a;億速云閱讀&#xff1a;83作者&#xff1a;小新這篇文章將為大家詳細講解有關總結帝國CMS下在PHP文件中怎么調用數據庫類執行SQL語句實例&#xff0c;小編覺得…

網和aoe網的區別_運動內衣與普通內衣有什么區別?運動內衣里面還需要穿文胸嗎? 小家生活網20201002 11:03:04...

閱讀本文前&#xff0c;請您先點擊上面的“藍色字體可以說愛情就是他們最大的軟肋。不會在雙魚女那出現。在對于周邊的親戚時。她們那種溫柔大方的氣勢。更符合媽媽的需求。整雙腿沒有視覺連貫性。但唯獨感情這件事一直是水瓶們的知識盲區。他們雙商超高。可能最開始還是會去挽…

機器人無限火力無限e符文_LOL:無限火力開黑指南 三大玩法讓你快樂加倍

無限火力上線以來受到大家的熱烈追捧&#xff0c;今天給大家介紹幾個主流的系列&#xff0c;讓你在峽谷能夠感受到雙倍的快樂&#xff01;超強控制流這一類英雄都是帶有強力控制的&#xff0c;無限火力的80%減CD&#xff0c;能夠讓女坦等英雄可以打出長達幾秒的完美控制技能。首…