91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Paddind Oracle Attack的示例分析

發布時間:2021-11-20 11:43:25 來源:億速云 閱讀:133 作者:小新 欄目:數據安全

這篇文章將為大家詳細講解有關Paddind Oracle Attack的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

適用條件

  • 加密方式為AES.CBC模式

  • 已知加密后的cipher

  • 已知加密時初始的iv

攻擊原理

如果明文過長,需要一個塊一個塊的進行解密,只是iv發生了變換,其中的過程一模一樣

對于每一塊的明文,從后向前一位一位的解密

先看CBC經典圖

Paddind Oracle Attack的示例分析

在加密時

Paddind Oracle Attack的示例分析

在解密時Paddind Oracle Attack的示例分析

攻擊實現

存在一個服務器,會返回密文解密后的正確與否(padding),隨后返回解密的狀態,我們就可以通過該種方式取得加密后且與iv異或之前的中間態I,那么我們發現I=C⊕P,而C已知,我們就可以通過異或來得到原來的明文P,所以接下來的主要矛盾即是求得這個中間態I

我們選擇構建iv=\x00*16,將這個iv發送給服務器后會進行padding測試,假設P的最后一位為X,那么當且僅當padding后的結果為0x01時(P⊕i⊕0x01),服務器才會判定正確,那么我們即可對該位iv進行爆破測試,當服務器返回正確時,我們很大幾率上是得到了正確的I了,所以我們從最低位開始枚舉,當該位正確時,接著向前一位開始枚舉,知道全部位被取得時,也就是I已知的時候了,最后利用I⊕IV即可得到該塊的明文P了。

隨后將IV改為上一個塊的密文,重復上述操作即可。

例題

1. 0xGame Padding Oracle

這里放一道標準實例題,相關分析如上,這里演示下具體操作。

Paddind Oracle Attack的示例分析

胡亂分析.jpg

這里因為懶,所以手動改代碼后多跑了幾遍,因為這玩意爆破一次時間長得離譜,debug噩夢


from string import digits, ascii_letters
from pwn import *
from hashlib import sha256
from Crypto.Util.number import *
import os

table = digits+ascii_letters
r = remote("49.235.239.97", "10003")

def proof_of_work():
rev = r.recvuntil("sha256(XXXX+")
suffix = r.recv(16).decode()
r.recvuntil(" == ")
res = r.recv(64).decode()
def f(x):
hashresult = hashlib.sha256((x+suffix).encode()).hexdigest()
if hashresult == res:
return 1
else:
return 0
prefix = util.iters.mbruteforce(f,table,4,'upto')
r.sendline(str(prefix))

def read_data():
r.recvuntil("iv : ")
iv = r.recvuntil('\n')[:-1].decode()
iv = bytearray.fromhex(iv)
r.recvuntil("crypttext : ")
qwq = r.recvuntil('\n')[:-1].decode()
cbc = bytearray.fromhex(qwq)
return iv,cbc,qwq

proof_of_work()
print('Successfully pass the pow!')
iv,cbc,qwq=read_data()
mid = []
print('Successfully read the data!')
#print('iv =',iv)
#print('cbc =',cbc)
#print(cbc.hex()[64:])

r.recvuntil('> ')

iv = bytearray.fromhex(qwq)[16:32]
print(iv)
new_iv = bytearray(b'\x00'*16)
count = 1
for i in range(16):
for j in range(256):
new_iv[15-i] = j
r.sendline('1')
r.recvuntil('(in hex): ')
r.sendline(str(new_iv.hex()))
r.recvuntil('(in hex): ')
r.sendline(str(cbc.hex()[64:96]))
back = r.recvline(keepends = False)
r.recvuntil('> ')
if(b'success' in back):
print(back,j)
ans = j ^ count
break
count += 1
mid.append(ans)
for m in range(15-i,16):
new_iv[m] = count ^ mid[15-m]
find = ''
for i in range(16):
find += hex(iv[i] ^ mid[15 - i])[2:].rjust(2,'0')
flag = bytearray.fromhex(find)
print(flag)
r.interactive()

關于“Paddind Oracle Attack的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

谷城县| 东港市| 德惠市| 若尔盖县| 刚察县| 察隅县| 清原| 邹平县| 镇江市| 曲沃县| 清水县| 晋江市| 兴仁县| 永济市| 宁明县| 乌鲁木齐县| 监利县| 永州市| 宜兰市| 巍山| 土默特左旗| 永胜县| 荔浦县| 聂拉木县| 乌什县| 宜兰县| 会理县| 陇西县| 西林县| 浦江县| 肥乡县| 巴塘县| 于都县| 达日县| 远安县| 昌图县| 名山县| 来安县| 仁寿县| 牡丹江市| 陇川县|