總結:在使用加密的時候,我們可以加入隨機數,這樣相同的明文,每次加密后得到不同的密文,同時可以在密文中加入密文有效期,控制密文的有效時間長度。
針對有的功能擴展使用,很好的思想。
TEA對 64 位數據加密的密鑰長達 128 位,安全性相當好。其可靠性是通過加密輪數而不是算法的復雜度來保證的。從中可以看到TEA 算法主要運用了移位和異或運算。密鑰在加密過程中始終不變。
TEA(Tiny Encryption Algorithm)是一種小型的對稱加密解密算法,支持128位密碼,與BlowFish一樣TEA每次只能加密/解密8字節數據。TEA特點是速度快、效率高,實現也非常簡單。由於針對TEA的攻擊不斷出現,所以TEA也發展出幾個版本,分別是XTEA、Block TEA和XXTEA。
TEA使用64位一組加密,128長度的秘鑰,加密的到結果。相對XXTEA其加密可靠性低。
void encrypt(unsigned long *v, unsigned long *k) {
2 unsigned long y=v[0], z=v[1], sum=0, i; /* set up */
3 unsigned long delta=0x9e3779b9; /* a key schedule constant */
4 unsigned long a=k[0], b=k[1], c=k[2], d=k[3]; /* cache key */
5 for (i=0; i < 32; i++) { /* basic cycle start */
6 sum += delta;
7 y += ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
8 z += ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);/* end cycle */
9 }
10 v[0]=y;
11 v[1]=z;
12 }
13
14 void decrypt(unsigned long *v, unsigned long *k) {
15 unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
16 unsigned long delta=0x9e3779b9; /* a key schedule constant */
17 unsigned long a=k[0], b=k[1], c=k[2], d=k[3]; /* cache key */
18 for(i=0; i<32; i++) { /* basic cycle start */
19 z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
20 y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
21 sum -= delta; /* end cycle */
22 }
23 v[0]=y;
24 v[1]=z;
25 }
XXTEA加密字符串長度不是 4 的整數倍,則這些實現的在加密后無法真正還原,還原以后的字符串實際上與原字符串不相等,而是后面多了一些 \0 的字符,或者少了一些 \0 的字符。原因在於 XXTEA 算法只定義了如何對 32 位的信息塊數組(實際上是 32 位無符號整數數組)進行加密,而並沒有定義如何來將字符串編碼為這種數組。而現有的實現中在將字符串編碼為整數數組時,都丟失了字符串長度信息,因此還原出現了問題。
#define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);
long btea(long* v, long n, long* k) {
unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
long p, q ;
if (n > 1) {
q = 6 + 52/n;
while (q-- > 0) {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
y = v[0];
z = v[n-1] += MX;
}
return 0 ;
} else if (n < -1) {
n = -n;
q = 6 + 52/n;
sum = q*DELTA ;
while (sum != 0) {
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
return 0;
}
return 1;
}
long btea(long* v, long n, long* k)
v是要加密的組元的起始地址,以32bit為單位,這里用long來實現。
n是要加密的組元個數,正數是加密,負數是解密。
k是密鑰的起始地址,長度為4個組元,4*32=128bit。
返回值為0或1(對應n=0,沒有計算)。
加密的結果會直接寫回到v中。
經過試驗,我還有一點要補充的,XXTEA的計算是空間相關的,也就是說,在一個組元中,4個字節是不能斷章取義的,即密文的一部分,並不能還原成明文的一部分。所以,當數據不能被4個字節整除時,要做好字節的填充和對其等輔助工作。