密码学 | 对称加密算法RC4

news/2024/7/19 12:41:48 标签: 爬虫, 逆向, 密码学

一、简介

密码学中,RC4是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。所谓对称加密,就是加密和解密的过程是一样的。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。

RC4已经成为一些常用的协议和标准的一部分,如1997年的WEP和2003/2004年无线卡的WPA; 和1995年的SSL,以及后来1999年的TLS。让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。

二、基本原理

  • 加密:原文和Keystream进行异或得到密文
  • 解密:密文和Keystream进行异或得到原文

三、生成秘钥流(KeyStream)

1、初始化S和T

for i=0 to 255 do
   S[i]=i;
   T[i]=K[ i mod len(key) ];

2、初始排列S

j=0;
for i=0 to 255 do
   j=(j+S[i]+T[i]) mod 256;
   swap(S[i],S[j]);

3、产生密钥流

i,j=0;
for r=0 to len do  //r为明文长度,r字节
   i=(i+1) mod 256;
   j=(j+S[i]) mod 256;
   swap(S[i],S[j]);
   t=(S[i]+S[j]) mod 256;
   k[r]=S[t];

密码学中,S盒(Substitution-box)是对称密钥算法执行置换计算的基本结构。S盒用在分组密码算法中,是唯一的非线性结构,其S盒的指标的好坏直接决定了密码算法的好坏。

# coding=utf-8

import base64

def encrypt_logic(key, ciphertext):
    S = rc4_init(key)
    i = j = 0
    result = ''
    for a in ciphertext:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = chr(ord(a) ^ S[(S[i] + S[j]) % 256])
        result += k
    return result

def rc4_init(key):  # S盒初始化置换,K为密钥
    S = []
    j = 0
    k = []  # 临时数组
    for i in range(256):
        S.append(i)
        k.append(key[i % len(key)])
    for i in range(256):
        j = (j + S[i] + ord(k[i])) % 256
        S[i], S[j] = S[j], S[i]  # 交换S[i],S[j]
    return S


def rc4_encrypt(key,ciphertext):
    result = encrypt_logic(key,ciphertext)
    return base64.b64encode(result)


def rc4_decrypt(key,ciphertext):
    result = encrypt_logic(key,base64.b64decode(ciphertext))
    return result


if __name__ == '__main__':
    key = 'abcdefghijk'
    ciphertext = 'this is a test'
    print("key:" + key)
    print("message:" + ciphertext)

    en_ciphertext = rc4_encrypt(key, ciphertext)
    print("Encrypt:" + en_ciphertext)

    de_ciphertext = rc4_decrypt(key, en_ciphertext)
    print("Decrypt:" + de_ciphertext)

在安卓逆向中,RC4的特征并没有Base64那么明显,但是也可以根据S盒的长度、密钥流的产生过程及异或运算的特征来确定是否是RC4,当然,因为RC4属于流加密,所以也可以把明文的长度和加密后的长度是否相等作为入手点。


http://www.niftyadmin.cn/n/997303.html

相关文章

PhpStorm调试web应用

添加ShoppingcartServiceProvider报500错误时修改工程文件根目录权限 Debug Configuration添加PHP Web ApplicationUse path mapping 把工程目录与服务器目录对应起来转载于:https://www.cnblogs.com/qike/p/5806071.html

odu oracle 价格_Oracle Database Unloader(ODU) 3.09

网上http://www.laoxiong.net/odu下载不了了,好不容易从其它地方弄了一份,传到论坛上来供大家不时之需。详细使用说明见 http://www.laoxiong.net/odu--------------------------------------------------------什么是ODU?ODU全称为Oracle Database Unl…

SOA服务类项目开发模式

开发模式 以需求用例为基,Cas e&Coding两条线并行,服务(M)&消费(VC)分离,单元、接口、功能、集成四层质量管理,自动化集成、测试、交付全程支持。 3个大阶段(需求…

密码学 | RC4算法Native层分析

一、Java层分析 二、Native层分析 1、Java_cn_pojie52_cm01_MainActivity_check 首先分析入参出参和大体流程。 2、sub_B90 接下来看下sub_B90。 其中主要部分进行了两次循环,第一个大循环到256次,第二个里面有异或运算,这两个特征一出…

api调用怎么获得response数据_【数据分析入门】初识Web API(三)

因为各种琐事和情绪耽搁了几天,今天继续将之前整理好的api数据进行可视化。使用Pygal可视化仓库有了一些有趣的数据后,我们来进行可视化,呈现GitHub上Python项目的受欢迎程度。我们将创建一个交互式条形图:条形的高度表示项目获得…

KVM虚拟化简易部署

KVM虚拟化部署KVM必须在具备Intel VT或AMD-V功能的x86平台上运行。KVM包含一个为处理器提供底层虚拟化,可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。使用一个经过修改的QEMU(qemu-kvm),作为虚拟机上…

python单词相似度计算_Spark MLlib 之 大规模数据集的相似度计算原理探索

在spark中RowMatrix提供了一种并行计算相似度的思路,下面就来看看其中的奥妙吧!相似度相似度有很多种,每一种适合的场景都不太一样。比如:欧氏距离,在几何中最简单的计算方法夹角余弦,通过方向计算相似度&a…

Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

为什么80%的码农都做不了架构师?>>> 在上一篇Spring中使用JdbcTemplate访问数据库 中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端和Web站点的开发任务了。 然而&…