des解密不完整,前面幾位是亂碼的解決辦法

来源:http://www.cnblogs.com/Lands-ljk/archive/2016/09/20/5888765.html
-Advertisement-
Play Games

在工作中遇到的Des解密問題,第三方發來的數據需要我們進行des解密,但是解密的結果前幾位始終是亂碼。廢了半天勁,終於找到了問題所在。 下麵先介紹一下des,瞭解des的同學可以直接看下麵的解決辦法。 Des加密 DES全稱為Data EncryptionStandard,即數據加密標準。Des加密 ...


在工作中遇到的Des解密問題,第三方發來的數據需要我們進行des解密,但是解密的結果前幾位始終是亂碼。廢了半天勁,終於找到了問題所在。

下麵先介紹一下des,瞭解des的同學可以直接看下麵的解決辦法。

Des加密

DES全稱為Data EncryptionStandard,即數據加密標準。Des加密演算法是一種對稱加密演算法,所謂對稱加密演算法就是指對明文的加密以及對密文的解密用的是同一個密鑰。

Des使用一個56位的密鑰以及附加的8位奇偶校驗位,產生最大64位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文本塊分成兩半。使用子密鑰對其中一半應用迴圈功能,然後將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最後一個迴圈不交換。DES 使用 16 個迴圈,使用異或,置換,代換,移位操作四種基本運算。

特點:數據加密標準,速度較快,適用於加密大量數據的場合。

Des演算法的入口參數有三個:Key、Data、Mode。

  • Key: 為8個位元組共64位,Des演算法規定,其中第8、16、24、......64位是奇偶校驗位,不參與Des運算,所以常說Des的密鑰為56位。 在Des加密和解密的過程當中,密鑰的長度都必須是8位元組的倍數。

  • Data: 8個位元組64位,是要被加密後解密的數據。

  • Mode: Des的工作方式:加密、解密。

Des加密模式

Des的加密模式主要有CBC模式,ECB模式,它們分別使用不同的加密方式加密。

ECB模式指的是電子密碼本模式,是一種最古老,最簡單的模式,將加密的數據分成若幹組,每組的大小跟加密密鑰長度相同;然後每組都用相同的密鑰加密, 如果最後一個分組長度不夠64位,要補齊64位。

ECB模式的特點是:

  1. 每次Key、明文、密文的長度都必須是64位;

  2. 數據塊重覆排序不需要檢測;

  3. 相同的明文塊(使用相同的密鑰)產生相同的密文塊,容易遭受字典攻擊;

  4. 一個錯誤僅僅會對一個密文塊產生影響;

CBC模式指的是加密塊鏈模式,與ECB模式最大的不同是加入了初始向量。

CBC模式的特點是:

  1. 每次加密的密文長度為64位(8個位元組);

  2. 當相同的明文使用相同的密鑰和初始向量的時候CBC模式總是產生相同的密文;

  3. 密文塊要依賴以前的操作結果,所以,密文塊不能進行重新排列;

  4. 可以使用不同的初始化向量來避免相同的明文產生相同的密文,一定程度上抵抗字典攻擊;

  5. 一個錯誤發生以後,當前和以後的密文都會被影響;

填充方式

常見的填充方式PKCS5Padding,PKCS5Padding表示當數據位數不足的時候要採用的數據補齊方式,也可以叫做數據填充方式。PKCS5Padding這種填充方式,具體來說就是“填充的數字代表所填位元組的總數”

比如說,差兩個位元組,就是######22,差5個位元組就是###55555,這樣根據最後一個自己就可以知道填充的數字和數量。

保證加密解密的一致性 

在不同的平臺上,只要能保證這幾個參數的一致,就可以實現加密和解密的一致性。

  1. 加密和解密的密鑰一致

  2. 採用CBC模式的時候,要保證初始向量一致

  3. 採用相同的填充模式

python中的des加密

在python中,我們使用pyDes對數據進行des加密:

# pyDes.des(key, [mode], [IV], [pad], [padmode])
  • key: des的加密解密密鑰。

  • mode: 加密模式:支持CBC,ECB兩種模式

  • IV: 初始化向量,這是CBC模式專有的,長度為8 bytes。使用不同的初始化向量加密避免產生相同的密文,一定程度上抵抗字典攻擊。

  • pad: 當padmode設置為PAD_NORMAL時,用pad參數來指定填充方式。

  • padmode: 填充方式,預設為PAD_PKCS5填充模式。

    Example
    -------
    from pyDes import *
    
    data = "Please encrypt my data"
    k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    
    # For Python3, you'll need to use bytes, i.e.:
    # data = b"Please encrypt my data"
    # k = des(b"DESCRYPT", CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    
    d = k.encrypt(data)
    print "Encrypted: %r" % d
    print "Decrypted: %r" % k.decrypt(d)
    assert k.decrypt(d, padmode=PAD_PKCS5) == data

des加密後(CBC模式)使用相同的密鑰,初始向量,填充模式解密,解密後的字元前幾位是亂碼,其他位正常的解決辦法

des_key = 'ucgtchdp'

IV = '12345678'

k = des(des_key, mode=CBC, IV='12345678', padmode=PAD_PKCS5)

傳遞過來的加密數據: xUjw0iO7uhymZ+h/VB9kvhubiAEv4Kzz

通過k解密出來的數據:@IDX_^\x10Ys powerful

這種情況通常發生在不同語言(java加密、python解密)對初始向量的處理方式不同造成的解密不完全。

解決辦法:檢查初始向量的表現形式。

k1 = des(des_key, mode=CBC, IV='\1\2\3\4\5\6\7\x08', padmode=PAD_PKCS5)

通過k1解密出來的數據:python is powerful

OK!

轉載請註明出處~

更多內容請訪問:http://www.landsblog.com/blog/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • 一、Paramiko模塊 1.Paramiko安裝 Python的目錄下有個Scripts目錄,cd到這個目錄用這裡面的pip命令(如果添加的環境變數可以在cmd直接輸入命令):pip install paramiko。如果pip版本低會有提示,python -m pip install --upg ...
  • ➠更多技術乾貨請戳:聽雲博客 基本術語定義 1.系統棧(system stack)是一個記憶體區,位於進程地址空間的末端。 2.在將數據壓棧時,棧是自頂向下增長的,該記憶體區用於函數的局部變數提供記憶體。它也支持在調用函數時傳遞參數。 3.如果調用了嵌套的過程,棧會自上而下增長,並接受新的活動記錄(act ...
  • 題意:已知有n個城市,某歌手每月進行一場演唱會,共持續c個月,可連續兩個月在同一個城市。城市間的路費已給出,且已知每個城市在第k(1<=k<=c)個月舉辦演唱會的所得利潤,求最終的最大利潤。 分析:第i個月在第j個城市舉辦演唱會,最終可得最大利潤,由此可得狀態轉移方程:dp[i][j] = max( ...
  • 1.python使用對象模型來存儲數據。構造任何類型的值都是一個對象。”儘管python被當成一種面向對象的腳本的編程語言“,但你完全能夠寫出不使用任何類和實例的腳本。 python對象都擁有三個特性:(1)身份、(2)類型、(3)值、 (1)身份:每個對象都有一個唯一的身份來標識自己。可以使用內建 ...
  • 建議65:避開基本類型數組轉換列表陷阱 我們在開發中經常會使用Arrays和Collections這兩個工具類和列表之間轉換,非常方便,但也有時候會出現一些奇怪的問題,來看如下代碼: 也許你會說,這很簡單,list變數的元素數量當然是5了。但是運行後列印出來的列表數量為1。 事實上data確實是一個 ...
  • NamedParameterJdbcTemplate類是基於JdbcTemplate類,並對它進行了封裝從而支持命名參數特性。 NamedParameterJdbcTemplate主要提供以下三類方法:execute方法、query及queryForXXX方法、update及batchUpdate方 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...