MAC演算法通過CBC來實現ECB

2021-07-28 13:29:58 字數 2832 閱讀 5405

先來交代下背景吧,什麼是mac就不解釋了,網上搜搜一大堆。簡單來說這次mac要上送的他方mac的演算法是ecb模式(pos終端直接模式),但在我們使用的加密機中計算mac只支援3種模式:xor, ansi x9.9, ansi x9.19

大致上mac演算法基本都是要對待計算資料在末尾補齊0x00,使待計算資料的長度為8的倍數,隨後將待計算資料每8位分組。隨後對每組的資料進行操作。操作也無法是組與組之間異或,對結果使用mac key進行單des運算。區別只是什麼時候加密,怎麼加密的問題了。

xor

第一組與第二組進行以後,隨後結果在於第三組進行以後,以此類推,最後的結果使用mac key進行des加密運算,隨後取結果的前半部分。

這裡只用mac key加密了一次

異或之後每次都用mac key對異或結果進行des加密運算,運算後的結果與下一組再進行異或

ansi x9.19的金鑰必須是雙倍長度了,會將mac key按8位分成左半部,右半部。異或之後每次都用左半部對異或結果進行des加密運算,運算後的結果與下一組再進行異或。最後的結果用右半部進行des解密運算,然後再用左半部進行des加密運算,最後的結果就是mac

這是我所使用的加密機支援的演算法,現在對方使用的是銀聯ecb演算法,該演算法如下:

第一組與第二組進行以後,隨後結果在於第三組進行以後,以此類推,將最後的結果拉長,從8個位元組拉長為16個位元組,然後對前8個位元組進行des加密運算,運算後的結果在和後8個位元組進行一次以後,然後再對結果進行des加密運算,運算後的結果為8個位元組,拉長至16個位元組,取前8個位元組就是mac了。

好了,問題來了,怎麼使用支援xor, ansi x9.9, ansi x9.19的加密機,最後計算出ecb演算法的mac呢?

1. 自己先對待計算資料進行補齊,分組操作

2.

第一組與第二組進行以後,隨後結果在於第三組進行以後,以此類推,最後對8個位元組的結果進行拉長

這樣就完成了ecb演算法中紅框中的操作

然後使用cbc演算法進行運算,把dl和dr作為待加計算資料傳給加密機

紅框中的d0就是dl, d1就是dr

紅框中的演算法就和cbc的演算法是一樣的了

最後只需將最終的結果拉長成16位,再擷取前8個位元組就是最後我們所需要的mac了

---- 2014-12-11 ----

新一點版本的sjl05加密機是支援ecb演算法的。

把1位拉長為2位遇到乙個問題,例如:

0x38 0xa7

是按照 38 a7拉長為 33 38 41 37

還是按照

38 a7 拉長為33 38 61 37

答案應該是按照第二種,如果遇到英文本母,那應該是大寫後再拉長

還有一點需要注意的,雖然圖示中說的演算法是des,但是sjl05加密機是可以支援雙倍金鑰,也就是將圖示中原先的des改為3des的,已驗證

最短路SPFA演算法 (通過鄰接表來實現)

適用範圍 給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman ford演算法的複雜度又過高,spfa演算法便派上用場了。我們約定有向加權圖g不存在負權迴路,即最短路徑一定存在。當然,我們可以在執行該演算法前做一次拓撲排序,以判斷是否存在負權迴路,但這不是我們討論的...

在Sqlite中通過Replace來實現插入和更新

你可能在批量處理乙個事務的時候,想要批量插入一系列的資料,但是這些資料當新增完一次之後,重新新增的時候,你不想要重新新增,只是想將原有的資料進行更新,例如 我想要通過excel將一系列的圖書匯入到資料庫中,而這些圖書在你下一次編輯之後,重新匯入,只是對原有的資料進行修改。以上是乙個業務的場景。在ms...

在Sqlite中通過Replace來實現插入和更新

你可能在批量處理乙個事務的時候,想要批量插入一系列的資料,但是這些資料當新增完一次之後,重新新增的時候,你不想要重新新增,只是想將原有的資料進行更新,例如 我想要通過excel將一系列的圖書匯入到資料庫中,而這些圖書在你下一次編輯之後,重新匯入,只是對原有的資料進行修改。以上是乙個業務的場景。在ms...