一種輕量級對稱加密演算法TEA
阿新 • • 發佈:2020-12-27
技術標籤:演算法
簡介
TEA演算法由劍橋大學計算機實驗室的David Wheeler和Roger Needham於1994年發明。它是一種分組密碼演算法,其明文密文塊為64位元,金鑰長度為128位元。TEA演算法利用不斷增加的Delta(黃金分割率)值作為變化,使得每輪的加密值不同。雖然TEA演算法比 DES(Data Encryption Standard) 要簡單得多, 但有很強的抗差分分析能力,加密速度也比 DES 快得多,比較試用於一些低效能處理器場合
加密演算法
unsigned int key[4] = { 0xA91B,0x8F61,0x15FF,0xF251}; //Tea加密祕鑰,可自定定義
/*
*加密過程操作最小單位為4個Byte(unsigned int)
*/
//加密過程
void Encrypt(unsigned int* v, unsigned int* k)
{
unsigned int v0 = v[0], v1 = v[1], sum = 0, i; /* set up */
unsigned int delta = 0x9e3779b9; /* a key schedule constant */
unsigned int 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;
}
//解密過程
void Decrypt(unsigned int* v, unsigned int* k)
{
unsigned int v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i; /* set up */
unsigned int delta = 0x9e3779b9; /* a key schedule constant */
unsigned int k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */
for (i = 0; i<32; i++) { /* basic cycle start */
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
} /* end cycle */
v[0] = v0; v[1] = v1;
}
void Encrypt_UseDefaultKey(unsigned int* v)
{
Encrypt(v, key);
}
void Decrypt_UseDefaultKey(unsigned int* v)
{
Decrypt(v, key);
}
測試程式碼
int main(void)
{
unsigned int test = 0xAABBCCDD;
printf("原始資料為\t\t0x%08X\r\n", test);
Encrypt_UseDefaultKey(&test);
printf("加密後的資料為\t\t0x%08X\r\n", test);
Decrypt_UseDefaultKey(&test);
printf("解密後的資料為\t\t0x%08X\r\n", test);
while (1);
}
程式碼輸出結果
一般使用場景
- 某段資料儲存過程進行加密
- 資料傳輸通訊過程進行加密
- IAP升級檔案的加密