為什麼 Gameboy Advance 串列加密包含目標字節地址?
Gameboy Advance 對通過其串列埠發送的數據進行加密。它組裝一個隨機數來作為線性同餘生成器的種子。然後,它對這個 PRN、數據、對稱密鑰和文件的字節偏移量進行異或運算。
這有什麼理由嗎?接收器必須知道字節地址,因為它需要知道迭代 LCG 的次數。
(有關算法的描述,請參見此處。)
我正在嘗試確定該算法是流密碼還是 CTR 模式下的某個版本的分組密碼。
引用連結的來源:
if normal_mode then c=C387h:x=C37Bh:k=43202F2Fh if multiplay_mode then c=FFF8h:x=A517h:k=6465646Fh m=dword(pp,cc,cc,cc):f=dword(hh,rr,rr,rr) for ptr=000000C0h to (file_size-4) step 4 c=c xor data[ptr]:for i=1 to 32:c=c shr 1:if carry then c=c xor x:next m=(6F646573h*m)+1 send_32_or_2x16 (data[ptr] xor (-2000000h-ptr) xor m xor k) next c=c xor f:for i=1 to 32:c=c shr 1:if carry then c=c xor x:next wait_all_units_ready_for_checksum:send_32_or_1x16 (c) pp palette_data cc random client_data[1..3] from slave 1-3, FFh if slave not exist hh handshake_data, 11h+client_data[1]+client_data[2]+client_data[3]
我把這個問題讀作詢問
xor (-2000000h-ptr)
.它通過隱蔽性來增加一小層安全性,但不會從密碼學的角度加強算法,因為被動竊聽者
ptr
僅通過計算交換的八位位組就可以知道。該算法是用於加密的流密碼(密鑰流獲得為線性同餘生成器的 XOR
m
,上述(-2000000h-ptr)
和密鑰k
);c
和一個用於完整性的 MAC(使用帶有定義的回饋多項式的循環冗餘校驗x
)。整個事情比真正的加密更安全。更新:該
ptr
術語自然不能視為CTR 操作模式的計數器。為此,我們需要將密鑰流的塊表示為密鑰和計數器的函式,而無需其他內部狀態按順序演變。這裡我們還有其他這樣的內部狀態m
。否則說,很容易將在 CTR 模式下操作的密碼轉換為直接訪問,而這裡迭代的 LCG 使這變得不安。我認為在任何模式下都沒有自然的方式將其視為分組密碼。另一方面,如果我們真的想要這樣,可以將 LCG 的狀態表示為目前值和初始值的
m
函式,然後密鑰流變為,或F``ptr``m0=dword(pp,cc,cc,cc)``(-2000000h-ptr) xor F(ptr,m0) xor k
$ E_{(\mathtt{m_0},\mathtt{k})}(\mathtt{ptr}) $ , 我們有一個帶有分組密碼的 CTR 模式 $ E $ ,其明文輸入的擴散極弱。如果我們以迭代方式實現,那將是非常低效F
的,但有一些方法可以解決。