-
-
[分享]RC4加密
-
发表于: 2021-9-13 15:00 16831
-
简介
密码类型:对称加密密码、面向字节操作的流密码
密钥:1-256字节(长度可变)
明文:1字节
密文:1字节
RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的
每一个字节
,解密的时候也是依次对密文中的每一个字节进行解密。
密钥生成流程
RC4算法主要包括两个部分:1)使用 key-scheduling algorithm (KSA) 算法根据用户输入的秘钥 key 生成 S 盒;2)使用 Pseudo-random generation algorithm (PRGA) 算法生成秘钥流用于加密数据。
KSA
KSA算法初始化长度为 256 的 S 盒。
第一个 for 循环将 0 到 255 的互不重复的元素装入 S 盒;
第二个 for 循环根据密钥打乱 S 盒。
1 2 3 4 5 6 7 8 | for i from 0 to 255 S[i] : = i endfor j : = 0 for i from 0 to 255 j : = (j + S[i] + key[i mod keylength]) mod 256 swap values of S[i] and S[j] endfor |
PRGA
Pseudo-random generation algorithm (PRGA) 算法根据 S 盒生成与明文长度相同的秘钥流,使用秘钥流加密明文。秘钥流的生成如下图所示:
循环体中每收到一个字节,a 和 b 定位S盒中的一个元素,并与输入字节异或,得到密文 k;同时,c 还改变了 S 盒。
1 2 3 4 5 6 7 8 9 | i : = 0 j : = 0 while GeneratingOutput: i : = (i + 1 ) mod 256 / / a j : = (j + S[i]) mod 256 / / b swap(S[i],S[j]) / / c K : = inputByte ^ S[(S[i] + S[j]) mod 256 ] / / d output K endwhile |
加密与解密
由于异或运算的特性,使得加密与解密过程一致。如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文。
C实现详细RC4算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <stdio.h> #include <string.h> #include <stdlib.h> void swap(unsigned char * a, unsigned char * b) { unsigned char t = * a; * a = * b; * b = t; } void rc4KSA(unsigned char * s, const unsigned char * key, int len ) { for ( int i = 0 ; i < 256 ; i + + ) s[i] = i; int j = 0 ; for ( int i = 0 ; i < 256 ; i + + ) { j = (j + s[i] + * (key + i % len )) % 256 ; swap(s + i, s + j); } } void rc4PRGA(unsigned char * s, char * data, size_t len ) { int i = 0 ; int j = 0 ; for ( size_t idx = 0 ; idx < len ; idx + + ) { i = (i + 1 ) % 256 ; j = (j + s[i]) % 256 ; swap(s + i, s + j); unsigned char k = s[(s[i] + s[j]) % 256 ]; data[idx] ^ = k; / / k是伪随机数,和明文进行XOR进行加密 } } int main( int argc, const char * argv[]) { unsigned char s[ 256 ]; / / S - box unsigned char key[ 128 ]; / / key的长度 1 到 256 字节,本例子使用 128 字节 arc4random_buf((unsigned char * )key, sizeof(key)); / / 用伪随机数算法生成key char data[ 1000 ] = "这里是要机密的数据" ; / / 加密 rc4KSA(s, key, sizeof(key)); rc4PRGA(s, data, strlen(data)); / / 解密 rc4KSA(s, key, sizeof(key)); rc4PRGA(s, data, strlen(data)); return 0 ; } |
使用python进行RC4加解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from Crypto.Cipher import ARC4 def encrypt(message, key): des = ARC4.new(key) cipher_text = des.encrypt(message) return cipher_text def decrypt(cipher_text, key): des3 = ARC4.new(key) message = des3.decrypt(cipher_text) return message if __name__ = = "__main__" : key = "0123456789abcdef" message = "www.biaodianfu.com" cipher_text = encrypt(message, key) print (cipher_text. hex ().upper()) message = decrypt(cipher_text, key) print (message.decode( "utf-8" )) |
逆向特征
密钥生成
加密
参考
《加密与解密》
github rc4脚本
逆向中常见的Hash算法和对称加密算法的分析
赞赏
他的文章
- Android主流的污点分析工具 1566
- [翻译]“过滤-静音”操作:调查EDR内部通信 12159
- [翻译]Windows授权指南 6000
- [翻译]利用Android WebView漏洞 8007
- [翻译]伪造调用堆栈以混淆EDR 11680
看原图
赞赏
雪币:
留言: