「流密碼(序列密碼)與rc4演算法」
rc4是一種序列密碼,它是一種可變金鑰長度、面向位元組操作的序列密碼,乙個明文位元組與乙個金鑰位元組相異或產生乙個密文位元組。
演算法原理:對於n = 8位長的字,即以乙個位元組為單位,此時n = 256,用從1到256個位元組的可變長度金鑰初始化乙個256個位元組的狀態向量arr,arr中的元素arr[0],arr[1],,,arr[255],自始至終置換後的arr包含0~255的所有8位元數,金鑰流中的金鑰key由arr中256個元素按一定方式選出乙個元素來充當;每生成乙個key值,arr中的元素就被重新置換一次。
初始化:
將arr中的元素初始化成arr[0] = 0,arr[1] = 1,,,,,arr[255] = 255,設金鑰的長度為len,對於arr中的每個元素,由金鑰k將arr[i]中的元素進行置換,由於只是第陣列中的元素進行錯亂的排列,陣列arr中還包含0~255個元素。
//初始化的核心**
for (int i = 0; i < 256; i++)
//將陣列中的資料進行錯亂排列
for (int i = 0; i < 256; i++)
加密時,將輸入的明文與金鑰進行異或,解密時,將密文與金鑰進行異或。
//加密、解密的核心**
for (size_t j = 0; j < len; j++)
下面是完整的程式:
//標頭檔案「stream.h」
#pragma once
//序列密碼(流密碼)
#include void rc4(char* arr, char* ptr, size_t len) //進行加密或者解密,arr是金鑰,ptr是明文
}void init(char *arr, char* key, size_t len) //初始化金鑰,(金鑰排程演算法ksa)
; char tmp = 0;
for (int i = 0; i < 256; i++)
//將陣列中的資料進行錯亂排列
for (int i = 0; i < 256; i++)
}void menu(char *arr, char* key, char* ptr) //主選單
; printf("**********************************\n");
printf("********* ——rc4演算法 *********\n");
printf("********* 1.加密與解密 *********\n");
printf("********* 0.退出 *********\n");
printf("**********************************\n");
printf("---請選擇:");
scanf("%c", &n);
switch (n)
else
}init(arr, key, strlen(key));
for (int i = 0; i < 256; i++) //儲存初始化後的arr
rc4(arr, ptr, strlen(ptr)); //加密
printf("\n輸出的密文為:");
printf("%s", ptr);
rc4(arr1, ptr, strlen(ptr)); //解密
printf("\n輸出的明文為:");
printf("%s", ptr);
break;
case '0':
exit(exit_failure);
default:
break;
}}
//原始檔stream.cpp
#define _crt_secure_no_warnings 1
#include #include #include "stream.h"
int main()
; char key[256] = ;
char ptr[256] = ;
menu(arr, key, ptr);
system("pause");
return 0;
}
序列密碼之RC4
rc4是乙個典型的基於非線性陣列變換的序列密碼。它以乙個足夠大的陣列s為基礎,對其進行非線性變換,產生非線性的金鑰流序列。rc4演算法s盒的大小根據引數n的值而變化,通常n 8,這樣rc4可生成256個元素的陣列s 種子金鑰長度為1 256個位元組 8 2048位元 的可變長度,用於初始化256個位...
密碼學原理 流密碼和RC4演算法
金鑰輸入到乙個偽隨機數發生器,該偽隨機數發生器產生一串隨機的8位數,輸出的金鑰流和明文流的每個位元組進行對位異或運算,得到乙個位元組,解密時使用相同的偽隨機序列。設計流密碼需要注意 分組密碼的優點是可以重複使用金鑰,但如果流密碼對兩個文明用相同金鑰加密,那麼密文分析就相當容易。rc4是ron riv...
流密碼加密(RC4和LFSR)
演算法思想 1 先初始化狀態向量s 256個位元組,用來作為金鑰流生成的種子1 按照公升序,給每個位元組賦值0,1,2,3,4,5,6 254,255。2 初始金鑰 由使用者輸入 長度任意。如果輸入長度小於256個位元組,則進行輪轉,直到填滿。例如輸入金鑰的是1,2,3,4,5,那麼填入的是1,2,...