详细了解RC4加密算法

一.什么是RC4加密算法

RC4加密算法是一种对称加密算法
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。

RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。

同时它也属于对称加密算法中的流密码加密算法,流密码不对明文数据进行分组,而是用密钥生成与明文一样长短的密码流对明文进行加密。密钥长度可变,面向字节操作。是以一个足够大的表s为基础,对表进行非线性变换,产生密钥流。

二.实现原理

三.具体实现(步骤和代码)

RC4算法中的几个关键变量:

1:S-Box 也就是所谓的S盒,是一个256长度的char型数组,每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换。

2:密钥K char key[256] 密钥的长度keylen与明文长度、密钥流的长度没有必然关系

3:临时向量k 长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给k,否则,轮转地将密钥的每个字节赋给k

(1)密钥调度算法KSA(Key Scheduling Algorithm)
​  1.对S表进行线性填充(一般为256字节,用来作为密钥流生成的种子1)

  2.用种子密钥(就是我们的秘钥)循环填充另一个256字节的K表,(用来作为密钥流生成的种子2)

【1】如果输入长度大于等于256个字节,则进行截取

【2】如果输入长度小于256个字节,则进行轮转,直到填满,例如输入密钥的是1,2,3,4,5   ,  那么填入的是1,2,3,4,5,1,2,3,4,5,1,2,3,4,5........

 3.用K表对S表进行初始置换(用来打乱初始种子1)

def get_message():
	print("输入你的信息: ")
	s=input()
	return s
 
def get_key():
	print("输入你的密钥: ")
	key=input()
	if key=='':
		key="不要输入空的 key 值"
	return key
 
def init_box(key):
	"""
	S盒
	"""
	s_box=list(range(256))	#我这里没管秘钥小于256的情况,小于256应该不断重复填充即可,这里完成了 C 实现中的 for(i=0;i<256;i++) prc4->s_box[i] = i;
	j=0
	for i in range(256):
		j=(j+s_box[i] + ord(key[i % len(key)])) % 256	#这里把 C 实现中的 prc4->t_box[i] = key[i % keylen];和j=(j+prc4->s_box[i]+prc4->t_box[i])%256;合并在了一起。
		s_box[i],s_box[j] = s_box[j],s_box[i]
	#print(type(s_box)) #可以输出 s_box 来看是否随机混乱的
	return s_box

(2)伪随机数生成算法(PRGA)
为每个待加密字节生成一个伪随机数,用来异或,表S一旦完成初始化,种子密钥就不再被使用

def ex_encrypt(plain,box,mode):
	"""
    利用PRGA生成秘钥流并与密文字节异或,加解密同一个算法
    """
	if mode == '2':
		while True:
			c_mode=input("输入你的解密模式:base64 or ordinary\n")
			if c_mode == 'base64':
				plain=base64.b64decode(plain)
				plain=bytes.decode(plain)				#因为返回的是解码过的  bytes,所以需要再用 decode 解码成字符串。
				break
			elif c_mode == 'ordinary':
				break
			else:
				print("输入不合法,请重新输入")
				continue

四.完整代码

参照解析 RC4 加密算法(C语言、python)-CSDN博客

# -*- coding: utf-8 -*-
import base64
 
def get_message():
	print("输入你的信息: ")
	s=input()
	return s
 
def get_key():
	print("输入你的密钥: ")
	key=input()
	if key=='':
		key="不要输入空的 key 值"
	return key
 
def init_box(key):
	"""
	S盒
	"""
	s_box=list(range(256))	#我这里没管秘钥小于256的情况,小于256应该不断重复填充即可,这里完成了 C 实现中的 for(i=0;i<256;i++) prc4->s_box[i] = i;
	j=0
	for i in range(256):
		j=(j+s_box[i] + ord(key[i % len(key)])) % 256	#这里把 C 实现中的 prc4->t_box[i] = key[i % keylen];和j=(j+prc4->s_box[i]+prc4->t_box[i])%256;合并在了一起。
		s_box[i],s_box[j] = s_box[j],s_box[i]
	#print(type(s_box)) #可以输出 s_box 来看是否随机混乱的
	return s_box
 
def ex_encrypt(plain,box,mode):
	"""
    利用PRGA生成秘钥流并与密文字节异或,加解密同一个算法
    """
	if mode == '2':
		while True:
			c_mode=input("输入你的解密模式:base64 or ordinary\n")
			if c_mode == 'base64':
				plain=base64.b64decode(plain)
				plain=bytes.decode(plain)				#因为返回的是解码过的  bytes,所以需要再用 decode 解码成字符串。
				break
			elif c_mode == 'ordinary':
				break
			else:
				print("输入不合法,请重新输入")
				continue
	
	res=[]
	i=j=0
	for s in plain:						#与 C 实现无太大差异
		i=(i+1)%256
		j=(j+box[i])%256
		box[i],box[j]=box[j],box[i]
		t=(box[i]+box[j]) % 256
		k=box[t]
		res.append(chr(ord(s)^k))
 
	cipher="".join(res)
    #print(cipher)
 
#根据选择进行输出,至于是明文还是密文得看用户决定
	if mode == '1':
        # 化成可视字符需要编码
		print("加密后的输出(没经过任何编码)")
		print(cipher)
        # base64的目的也是为了变成可见字符
		print("base64后的编码")
		print(str(base64.b64encode(cipher.encode('utf-8')),'utf-8'))
	if mode == '2':
		print("解密后的密文")
		print(cipher)
 
def get_mode():
	print("请选择加密或者解密")
	print("1.Encrypt")
	print("2.Decrypt")
 
	mode = input()
 
	if mode == '1':			#加密解密虽同源,但是由于不能直接用 =='1' or '2',所以还是得分开写
		message = get_message()
		key = get_key()
		box = init_box(key)
		ex_encrypt(message,box,mode)
	elif mode == '2':			#由于异或运算的对合性,RC4加密解密使用同一套算法。
		message = get_message()
		key = get_key()
		box = init_box(key)
		ex_encrypt(message,box,mode)
	else:
		print("输入有误! ")
 
if __name__ == '__main__':
	while True:
		get_mode()

 

  • 39
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RC4加密算法是一种流密码(stream cipher)算法,它以对称密钥的方式对数据进行加密。以下是使用C语言实现RC4加密算法的示例代码: ```c #include <stdio.h> #include <string.h> void swap(unsigned char *a, unsigned char *b) { unsigned char temp = *a; *a = *b; *b = temp; } void rc4(unsigned char *key, unsigned char *data, int data_length) { unsigned char s[256]; int i, j = 0, k; // 初始化S盒 for (i = 0; i < 256; i++) { s[i] = i; } // 根据密钥打乱S盒 for (i = 0; i < 256; i++) { j = (j + s[i] + key[i % strlen(key)]) % 256; swap(&s[i], &s[j]); } // 加密/解密数据 i = j = 0; for (k = 0; k < data_length; k++) { i = (i + 1) % 256; j = (j + s[i]) % 256; swap(&s[i], &s[j]); data[k] ^= s[(s[i] + s[j]) % 256]; } } int main() { unsigned char key[] = "mykey"; unsigned char data[] = "Hello, world!"; int data_length = strlen(data); printf("原始数据: %s\n", data); rc4(key, data, data_length); printf("加密后的数据: "); for (int i = 0; i < data_length; i++) { printf("%02X ", data[i]); } printf("\n"); rc4(key, data, data_length); printf("解密后的数据: %s\n", data); return 0; } ``` 在这段代码中,我们首先定义了一个swap函数,用于交换两个字节的位置。然后,我们定义了rc4函数来实现RC4算法。在rc4函数中,我们首先初始化了一个256字节的S盒,并根据密钥打乱S盒的顺序。然后,我们使用打乱后的S盒来加密/解密数据。最后,我们在main函数中使用示例密钥和数据来进行加密和解密,并输出结果。 请注意,这只是一个简单的示例,实际使用中需要注意安全性和性能等方面的考虑。此外,RC4算法已经有一些已知的安全漏洞,在实际应用中可能需要选择更安全的加密算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值