173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

rc4加密算法的初始阶段

keros@mark 2022-10-27 资讯中心

很高兴和大家一起分享rc4加密算法的初始阶段的知识,希望对各位有所帮助。

本文目录一览

求RC4算法的原理,最好用通俗的语言讲解,能打下比方更好了(本人能看懂一点VB跟C)

RC4经典加密算法VB版本代码

VB版rc4算法

Public Sub main()

Dim key As String

For i = 1 To 16

Randomize

key = key Chr(Rnd * 255)

Next i

MsgBox RC4(RC4("Welcome To Plindge Studio!", key), key)

End Sub

Public Function RC4(inp As String, key As String) As String

Dim S(0 To 255) As Byte, K(0 To 255) As Byte, i As Long

Dim j As Long, temp As Byte, Y As Byte, t As Long, x As Long

Dim Outp As String

For i = 0 To 255

S(i) = i

Next

j = 1

For i = 0 To 255

If j Len(key) Then j = 1

K(i) = Asc(Mid(key, j, 1))

j = j + 1

Next i

j = 0

For i = 0 To 255

j = (j + S(i) + K(i)) Mod 256

temp = S(i)

S(i) = S(j)

S(j) = temp

Next i

i = 0

j = 0

For x = 1 To Len(inp)

i = (i + 1) Mod 256

j = (j + S(i)) Mod 256

temp = S(i)

S(i) = S(j)

S(j) = temp

t = (S(i) + (S(j) Mod 256)) Mod 256

Y = S(t)

Outp = Outp Chr(Asc(Mid(inp, x, 1)) Xor Y)

Next

RC4 = Outp

End Function

什么是RC4、RC5、aes?

aes加密算法

aes加密算法原理

随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即aes[1]。经过三轮的筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为aes的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对aes还有不同的看法,但总体来说,aes作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。aes设计有三个密钥长度:128,192,256位,相对而言,aes的128密钥比DES的56密钥强1021倍[2]。aes算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合AVR汇编语言,实现高级数据加密算法aes。

aes是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。

1.1圈变化

aes每一个圈变换由以下三个层组成:

非线性层——进行Subbyte变换;

线行混合层——进行ShiftRow和MixColumn运算;

密钥加层——进行AddRoundKey运算。

① Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。

② ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。

③ 在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。 b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即 b(x)=c(x)·a(x)(mod x4+1) 对于这个运算 b0=02。a0+03。a1+a2+a3 令xtime(a0)=02。a0其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。

对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。

④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。

⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。

1.2轮变化

对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。

1.3密钥扩展

aes算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:① 位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];② S盒变换(subword)——对一个4字节进行S盒代替;③ 变换Rcon——Rcon表示32位比特字[xi-1,00,00,00]。这里的x是(02),如 Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]…… 扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[]=W[[i-1]]W[[i- Nk]]。但是若i为Nk的倍数,则W=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。

aes的加密与解密流程如图1所示。

RC4的原理

RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box的长度为256,密钥长度为Len。先来看看算法的初始化部分(用C代码表示):

其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];

参数2是密钥,其内容可以随便定义:char key[256];

参数3是密钥的长度,Len = strlen(key); /*初始化函数*/void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len){    int i=0,j=0;    char k[256]={0};    unsigned char tmp=0;    for(i=0;i256;i++) {        s[i]=i;        k[i]=key[i%Len];    }    for(i=0;i256;i++) {        j=(j+s[i]+k[i])%256;        tmp=s[i];        s[i]=s[j];//交换s[i]和s[j]        s[j]=tmp;    }}在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

再来看看算法的加密部分(用C代码表示):

其中,参数1是上边rc4_init函数中,被搅乱的S-box;

参数2是需要加密的数据data;

参数3是data的长度. /*加解密*/void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len){    int i=0,j=0,t=0;    unsigned long k=0;    unsigned char tmp;    for(k=0;kLen;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;        Data[k]^=s[t];    }}最后,在main函数中,调用顺序如下: int main(){unsigned char s[256]={0},s2[256]={0};//S-boxchar key[256]={justfortest};char pData[512]=这是一个用来加密的数据Data;unsigned long len=strlen(pData);int i;printf(pData=%s\n,pData);printf(key=%s,length=%d\n\n,key,strlen(key));rc4_init(s,(unsigned char*)key,strlen(key));//已经完成了初始化printf(完成对S[i]的初始化,如下:\n\n);for(i=0;i256;i++){    printf(%02X,s[i]);    if(i(i+1)%16==0)putchar('\n');}printf(\n\n);for(i=0;i256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{    s2[i]=s[i];}printf(已经初始化,现在加密:\n\n);rc4_crypt(s,(unsigned char*)pData,len);//加密printf(pData=%s\n\n,pData);printf(已经加密,现在解密:\n\n);//rc4_init(s,(unsigned char*)key,strlen(key));//初始化密钥rc4_crypt(s2,(unsigned char*)pData,len);//解密printf(pData=%s\n\n,pData);return0;}因此最终的完整程序是: //程序开始#includestdio.h#includestring.htypedef unsigned longULONG;/*初始化函数*/void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len){    int i = 0, j = 0;    char k[256] = { 0 };    unsigned char tmp = 0;    for (i = 0; i256; i++)    {        s[i] = i;        k[i] = key[i%Len];    }    for (i = 0; i256; i++)    {        j = (j + s[i] + k[i]) % 256;        tmp = s[i];        s[i] = s[j];//交换s[i]和s[j]        s[j] = tmp;    }}/*加解密*/void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len){    int i = 0, j = 0, t = 0;    unsigned long k = 0;    unsigned char tmp;    for (k = 0; kLen; 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;        Data[k] ^= s[t];    }}int main(){    unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box    char key[256] = { justfortest };    char pData[512] = 这是一个用来加密的数据Data;    unsigned long len = strlen(pData);    int i;    printf(pData=%s\n, pData);    printf(key=%s,length=%d\n\n, key, strlen(key));    rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化    printf(完成对S[i]的初始化,如下:\n\n);    for (i = 0; i256; i++)    {        printf(%02X, s[i]);        if (i  (i + 1) % 16 == 0)putchar('\n');    }    printf(\n\n);    for (i = 0; i256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!    {        s2[i] = s[i];    }    printf(已经初始化,现在加密:\n\n);    rc4_crypt(s, (unsigned char*)pData, len);//加密    printf(pData=%s\n\n, pData);    printf(已经加密,现在解密:\n\n);    //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥    rc4_crypt(s2, (unsigned char*)pData, len);//解密    printf(pData=%s\n\n, pData);    return 0;}//程序完

SSL/TLS 受诫礼;SSL/TLS RC4 信息泄露的问题

该IP地址启动了SSL证书,目前启动RC4加密属于不安全协议,所以需要禁止!

尝试收到处理漏洞:

禁止apache服务器使用RC4加密算法 

vi /etc/httpd/conf.d/ssl.conf 

修改为如下配置 

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4 

重启apache服务

关于nginx加密算法

1.0.5及以后版本,默认SSL密码算法是HIGH:!aNULL:!MD5

0.7.65、0.8.20及以后版本,默认SSL密码算法是HIGH:!ADH:!MD5

0.8.19版本,默认SSL密码算法是 ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM

0.7.64、0.8.18及以前版本,默认SSL密码算法是ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

低版本的nginx或没注释的可以直接修改域名下ssl相关配置为

ssl_ciphers "ECDHE-RSA-aes256-GCM-SHA384:ECDHE-RSA-aes128-GCM-SHA256:DHE-RSA-aes256-GCM-SHA384:DHE-RSA-aes128-GCM-SHA256:ECDHE-RSA-aes256-SHA384:ECDHE-RSA-aes128-SHA256:ECDHE-RSA-aes

256-SHA:ECDHE-RSA-aes128-SHA:DHE-RSA-aes256-SHA256:DHE-RSA-aes128-SHA256:DHE-RSA-aes256-SHA:DHE-RSA-aes128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:aes256-GCM-SHA384:aes128-GC

M-SHA256:aes256-SHA256:aes128-SHA256:aes256-SHA:aes128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

ssl_prefer_server_ciphers on;

需要nginx重新加载服务

其它解决办法:升级服务器环境到最新版,重新配置服务器SSL证书就可以直接解决,详情联系服务器环境技术人员处理。

php如何对文件进行RC4加密

1.原始钥匙 key

2.md5(md5+常量) 加密原始key = mkey

3.mkey 作为AC4的密匙 ac_mkey

4.ac_mkey 对加密数据 进行 AC4 加密 得到AC4密码

5.AC4密码 在进行一次 AC4加密可还原 加密数据

简单来说,一句话,用md5 做AC4的密匙

以下是代码

?php

/*

* rc4加密算法

* $pwd 密钥

* $data 要加密的数据

*/

function rc4 ($pwd, $data)//$pwd密钥 $data需加密字符串

{

$key[] ="";

$box[] ="";

$pwd_length = strlen($pwd);

$data_length = strlen($data);

for ($i = 0; $i 256; $i++)

{

$key[$i] = ord($pwd[$i % $pwd_length]);

$box[$i] = $i;

}

for ($j = $i = 0; $i 256; $i++)

{

$j = ($j + $box[$i] + $key[$i]) % 256;

$tmp = $box[$i];

$box[$i] = $box[$j];

$box[$j] = $tmp;

}

for ($a = $j = $i = 0; $i $data_length; $i++)

{

$a = ($a + 1) % 256;

$j = ($j + $box[$a]) % 256;

$tmp = $box[$a];

$box[$a] = $box[$j];

$box[$j] = $tmp;

$k = $box[(($box[$a] + $box[$j]) % 256)];

$cipher .= chr(ord($data[$i]) ^ $k);

}

return $cipher;

}

$key = '5201314'; //原始KEY

$pwd = md5(md5($key).'我是常量'); //md5+常量

$data = '我爱北京天安门'; //要加密的数据

$cipher = rc4($pwd, $data); //AC4 加密算法

$c = rc4($pwd, $cipher); //AC4 加密算法还原 (还原只需要重新加密一次)

echo 'pre';

var_dump($key);

var_dump($pwd);

var_dump($data);

var_dump($cipher);

var_dump($c);

?

随着社会的发展,产品的更新速度也是越来越快,算法是方案的核心,保护开发者和消费者的权益刻不容缓,那么加密芯片在其中就扮演了重要的角色,如何选择加密芯片呢?
1.市面上加密芯片种类繁多,算法多种,加密芯片强度参差不齐,加密性能与算法、秘钥密切相关。常见的加密算法有对称算法,非对称算法,国密算法,大部分都是基于I2C、SPI或1-wire协议进行通信。加密芯片还是需要项目实际需求选择,比如对称加密算法的特点是计算量小、加密速度快、加密效率高等。
2.因为单片机软加密性能较弱且非常容易被复制,所以有了加密芯片的产生,大大增加了破解难度和生产成本。目前加密芯片广泛应用于车载电子、消费电子、美容医疗、工业控制、AI智能等行业。
3.韩国KEROS加密芯片专注加密领域十多年,高安全性、低成本,在加密保护领域受到了众多客户的高度赞扬及认可。KEROS采用先进的内置aes256安全引擎和加密功能,通过真动态数据交互并为系统中敏感信息的存储提供了安全的场所,有了它的保护电路,即使受到攻击,这些信息也可以保持安全。其封装SOP8,SOT23-6,TDFN-6集成I2C与1-wire协议满足不同应用需求。CK02AT、CK22AT、CK02AP、CK22AP支持1.8V-3.6V,256bit位秘钥长度,5bytes SN序列号,支持定制化免烧录,加密行业首选。关于rc4加密算法的初始阶段的介绍到此就结束了,感谢大家耐心阅读。

本文标签:rc4加密算法的初始阶段

产品列表
产品封装
友情链接