RC4&RSA加密

RC4

RC4加密算法是一种对称加密算法

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

也就是说以流式进行异或,解密时只需相同逻辑即可异或解密

image-20250906193542768

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
key = list('RC4_1s_4w3s0m3')
content = [0xA7, 0x1A, 0x68, 0xEC, 0xD8, 0x27, 0x11, 0xCC, 0x8C, 0x9B, 0x16, 0x15, 0x5C, 0xD2, 0x67, 0x3E, 0x82, 0xAD,
0xCE, 0x75, 0xD4, 0xBC, 0x57, 0x56, 0xC2, 0x8A, 0x52, 0xB8, 0x6B, 0xD6, 0xCC, 0xF8, 0xA4, 0xBA, 0x72, 0x2F,
0xE0, 0x57, 0x15, 0xB9, 0x24, 0x11]
rc4number = 256
s = [0] * rc4number
flag = ''

def rc4_init(s, key, rc4number):
for i in range(rc4number):
s[i] = i
j = 0
for i in range(rc4number):
j = (j + s[i] + ord(key[i % len(key)])) % rc4number
s[i],s[j] = s[j],s[i]

def rc4_endecode(s, content, rc4number):
i = 0
j = 0
for k in range(len(content)):
i = (i + 1) % rc4number
j = (j + s[i]) % rc4number
s[i],s[j] = s[j],s[i]
t = (s[i] + s[j]) % rc4number
content[k] = chr(content[k] ^ s[t])
content = ''.join(content)
print(content)

rc4_init(s, key, rc4number)
rc4_endecode(s, content, rc4number)

RSA

安全算法:公开密钥加密之RSA算法

非对称加密是加密和解密使用不同密钥的一种加密方法。包括公开密钥和私有密钥

公开密钥(public key,后面简称P):加密用的密钥

私有密钥(secret key,后面简称S):解密用的密钥

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

密钥计算方法

  1. 选择两个大素数p和q(典型值为1024位)
  2. 计算n=p×qz=(p-1)×(q-1)// n表示欧拉函数
  3. 选择一个与z互质的数,令其为d(如8和15)
  4. 找到一个 e 使满足exd = 1 (mod z)(把 ed 相乘,再除以 z,余数等于 1,ed 互为模 z 的逆元)
  5. 公开密钥为(e,m),私有密钥为(d,m)

image-20250906195341466

  1. 将明文看成比特串,将明文划分成k位的块 P 即可,这里k是满足 2*k<n 的最大整数。
  2. 对每个数据块 P,计算 C= P^e^(mod n),C 即为P的密文。

对每个密文块 C,计算 P=C^d^(mod n),P即为明文

假设需要加密的明文信息为m=85,选择:e=7,p=11,q=13,说明使用RSA算法的加密和解密(计算密文并还原)

1
2
3
4
5
n=p*q=11*13=143
z=(p-1)*(q-1)=10*12=120

e*d=1(mod z)
7 * d( mod 120)=1 -------d=103

公钥:(e,n)=(7,143)

密文c=p^e^ (mod n)=123

解密:

密钥:(d,n)=(103,143) 明文:P=c^d^ (mod n)=85

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import gmpy2
import rsa

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

phin = (q - 1) * (p - 1)

d = gmpy2.invert(e, phin)

key = rsa.PrivateKey(n, e, int(d), p, q)

# 读取密文
with open("./flag.txt", "rb") as f:
ciphertext = f.read()

# 解密密文
decrypted_message = rsa.decrypt(ciphertext, key)
print(decrypted_message.decode())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import libnum
from Crypto.Util.number import long_to_bytes

q = 282164587459512124844245113950593348271
p = 366669102002966856876605669837014229419
e = 65537
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549

# invmod(a, n) - 求a对于n的模逆,逆向加密过程中计算ψ(n)=(p-1)(q-1),对ψ(n)保密,也就是对应根据e*d=1 mod ψ(n),求出d
d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n)
string = long_to_bytes(m) # 获取m明文,要转成字符串
# print(ex(m)[2:].decode('hex'))
print(string)