Created
February 5, 2022 17:16
-
-
Save Forgo7ten/28a2c20ade914e962a8c5714d36ccbca to your computer and use it in GitHub Desktop.
RC4加解密
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
/** | |
* rc4初始化函数(init) | |
* @param S | |
* @param key 密钥key | |
* @param key_len | |
*/ | |
void rc4_init(unsigned char *S, unsigned char *key, unsigned long key_len); | |
/** | |
* rc4 prga生成密钥流并加密 | |
* @param S 初始化后的S盒 | |
* @param data 需要加密的明文,加密后存放此处 | |
* @param data_len 明文长度 | |
*/ | |
void rc4_prga(unsigned char *S, unsigned char *data, unsigned long data_len); | |
void rc4_init(unsigned char *S, unsigned char *key, unsigned long key_len) { | |
int i = 0, j = 0; | |
char T[256] = {0}; | |
unsigned char tmp = 0; | |
for (i = 0; i < 256; i++) { | |
S[i] = i; | |
T[i] = key[i % key_len]; | |
} | |
for (i = 0; i < 256; i++) { | |
j = (j + S[i] + T[i]) % 256; | |
tmp = S[i]; | |
S[i] = S[j]; //交换s[i]和s[j] | |
S[j] = tmp; | |
} | |
} | |
void rc4_prga(unsigned char *S, unsigned char *data, unsigned long data_len) { | |
int i = 0, j = 0, t = 0; | |
unsigned long k = 0; | |
unsigned char tmp, ckey; | |
for (k = 0; k < data_len; k++) { | |
i = (i + 1) % 256; | |
j = (j + S[i]) % 256; | |
tmp = S[i]; | |
S[i] = S[j]; //交换s[x]和s[y] | |
S[j] = tmp; | |
t = (S[i] + S[j]) % 256; | |
ckey = S[t]; | |
data[k] ^= ckey; | |
} | |
} | |
void rc4_crypt(unsigned char *data, unsigned long data_len, unsigned char *key, unsigned long key_len) { | |
unsigned char s[256]; | |
rc4_init(s, key, key_len); | |
rc4_prga(s, data, data_len); | |
} | |
void rc4_example() { | |
unsigned char data[]{"1234"}; | |
unsigned long data_len = 4; | |
unsigned char key[]{"abcd"}; | |
unsigned long key_len = 4; | |
std::cout << std::hex; | |
std::cout << "加密前:"; | |
for (int i = 0; i < data_len; ++i) { | |
std::cout << (int) data[i] << " "; | |
} | |
std::cout << std::endl; | |
// 进行rc4加密 | |
rc4_crypt(data, data_len, key, key_len); | |
// 加密结果的打印 | |
std::cout << "加密后:"; | |
for (int i = 0; i < data_len; ++i) { | |
std::cout << (int) data[i] << " "; | |
} | |
std::cout << std::endl; | |
// 进行rc4解密 | |
rc4_crypt(data, data_len, key, key_len); | |
// 打印解密结果 | |
std::cout << "解密后:"; | |
for (int i = 0; i < data_len; ++i) { | |
std::cout << (int) data[i] << " "; | |
} | |
std::cout << std::endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment