Tea
TEA 加密是多少位移位?
void encrypt (unsigned long* v, unsigned long* k) { unsigned long v0=v[0], v1=v[1], sum=0, i; /* set up */ unsigned long delta=0x9e3779b9; /* a key schedule constant */ unsigned long k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */ for (i=0; i < 32; i++) { /* basic cycle start */ sum += delta; v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); } /* end cycle */ v[0]=v0; v[1]=v1; }
我在 TEA 加密的 wiki 上看到了這段程式碼,想知道這是否被認為是 4 位或 5 位算法,因為向左移動了 4 位,但向右移動了 5 位。
我對這種加密的算法感到困惑,如果有人能為我澄清它,我將不勝感激。
謝謝
TEA 既不被認為是 4 位算法,也不是 5 位算法(它們不按移位計數分類)。茶:
- 是一個 64 位的分組密碼,意思是
encrypt
修改 64 位:該分組是v[0]
v[1]
並且顯示的程式碼(不可移植)假設unsigned long
是 32 位的。- 具有 128 位密鑰
k[0]
k[1]
k[2]
k[3]
;請注意,每個鍵都有 3 個其他等效鍵(通過對偶數或/和奇數字的高位進行補碼獲得),因此鍵實際上是 126 位的。- 執行 32 次雙輪,在每個雙輪中(專注於移位,因為這是要求的)兩次左移 4 位,兩次右移 5 位(在 32 位數量上)。在具有 32 位桶形移位器的機器上進行 128 次移位,在沒有桶形移位器的 32 位ALU上進行 5760 次移位。
另外:計算算法中的移位的唯一兩個常見原因是:
- 確定為此花費了多少計算工作,以預測 CPU 如何影響性能。繼續這條軌道:在 8 位 CPU 上,32 位移位非常昂貴,而且每個加密的塊可能執行 23040 條移位指令的幼稚程式碼,移位代表我猜想 3/4 的工作量。
v1>>5
至少在彙編語言中,通過實現 的大多數位可以得到((v1<<4)>>8)>>1
,並且在 8 位 CPU 上移位 8 有效,可以做得更好。此外,許多 8 位 CPU 具有交換八位字節的一半的指令,並且可能用於移位 4。- 確定是否有足夠的擴散。在 TEA 中,它使用移位而不是旋轉(主要是因為 C 語言中沒有內置的旋轉,並且建構一個至少會使原始碼更複雜),因此在 32 個等級的位之間擴散32 位字主要是通過移位來實現的(對於右擴散來說尤其如此,並且進位傳播對左擴散有輕微的貢獻)。完全擴散需要大約 8 輪,這比在 DES 中說的要慢得多,DES 的擴散速度要快兩倍以上。這是 TEA 必須有很多輪次的幾個原因之一(64 輪對 DES 中的 16 輪)。