㈠ 加密算法:AES DES RC4 Rabbit TripleDes 那个更好它们分
DES不够安全。AES, TripleDes, RC4都可以。 Rabbit没听说过。
除了Rabbit,其他都是单钥体制的加密算法。就是用来加密而已。
一般的加密系统应该包括密钥产生,分配和管理的一个系统,分配的时候还会用到公钥体制用来加密密钥和传输密钥并用来签名。经常用的公钥算法是RSA。密钥是有时间限制的。用了时间太长了就得重新换一个避免被破解掉。
㈡ 求一个实现RC4加密算法的第三方包,java的
曾经实验室的带动,加上最近在上网络安全与管理的专业选修课,对加密算法有了浓厚的兴趣。老师留了一次作业,用自己的学号为密钥,加密一句话,使用RC4加密算法。
图书馆查找资料,发现RC4算法还是比较容易理解的。于是动手实现出来。不多说废话,还是贴代码吧。我写的注释还算清楚。
先贴一个含main函数的核心算法类,有测试,可以看看最后输出了什么^.^
import java.io.UnsupportedEncodingException;
public class Arithmetic {
public static void swap(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}
public static void main(String[] args) throws UnsupportedEncodingException {
// 密钥(我的学号)
byte K[]={0,6,1,6,1,0,0,4};
int S[]=new int[256];//状态矢量S
int T[]=new int[256];//临时矢量T
// 初始化状态矢量S,同时生成临时矢量T
for(int i=0;i<256;i++){
S[i]= i;
T[i]=K[i%K.length];
}
//用T使S置换
{
int j=0;
for(int i=0;i<256;i++){
j=(j+(int)S[i]+(int)T[i])%256;
swap(S[i],S[j]);
}
}
int i = 0,j=0;
boolean tt=true;
int c=0;
int t;
byte k;//密钥流的当前字节
byte C[]="套范续".getBytes();
System.out.println(C[3]);
byte P[]=new byte[C.length];
while(c<6){
i=(i+1)%256;
j=(j+S[i])%256;
swap(S[i],S[j]);
t=((S[i]+S[j])%256);
k=(byte) S[t];
// C[c]=(byte) (k^P[c]);
// System.out.print(C[c]+" ");
P[c]=(byte) (k^C[c]);
System.out.print(P[c]+" ");
c++;
}
System.out.println(new String(P,"GBK"));
// byte rr[]={65};
// System.out.println(new String(rr));
}
}
再来贴一下以界面展示的代码,比较长。用的就是普通的jsp+servlet。
核心类:
public class RC4 {
// 密钥(我的学号)
byte K[]={0,6,1,6,1,0,0,4};
void swap(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}
public String encrypt(String plaintext){
String ciphertext=new String();
int S[]=new int[256];//状态矢量S
int T[]=new int[256];//临时矢量T
// 初始化状态矢量S,同时生成临时矢量T
for(int i=0;i<256;i++){
S[i]= i;
T[i]=K[i%K.length];
}
//用T使S置换
{
int j=0;
for(int i=0;i<256;i++){
j=(j+(int)S[i]+(int)T[i])%256;
swap(S[i],S[j]);
}
}
int i = 0,j=0;
int c=0;
int t;
byte k;//密钥流的当前字节
byte P[]=plaintext.getBytes();
byte C[]=new byte[P.length];
while(c<P.length){
i=(i+1)%256;
j=(j+S[i])%256;
swap(S[i],S[j]);
t=((S[i]+S[j])%256);
k=(byte) S[t];
C[c]=(byte) (k^P[c]);
System.out.print(C[c]+" ");
c++;
}
System.out.println(new String(C));
ciphertext=new String(C);
return ciphertext;
}
}
页面:
home.jsp
<%@ page language="java" import="java.util.*,core.ChangeCharset" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'home.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="styles.css">
<script type="text/javascript">
function doencrypt(){
document.form1.domethod.value="encrypt";
document.form1.submit();
}
function dodecipher(){
document.form1.domethod.value="decipher";
document.form1.submit();
}
</script>
</head>
<body>
<%@ include file="header.jsp" %>
<div id="show" >
<form name="form1" method="post" action="Manage">
<input type="hidden" name="domethod" />
请输入一句话:<input type="text" name="plainText" />
<a href="javascript:void(0)" onclick="javascript:doencrypt();return false;">加密</a>
</br>
</br>
<%String cipher=(String)request.getAttribute("cipher");
if(cipher==null){
cipher="";
}
String plain1=(String)request.getAttribute("plain1");
if(plain1==null){
plain1="";
}
%>
所得密文:<input type="text" name="cipherText" value="<%=cipher %>" />
<a href="javascript:void(0)" onclick="javascript:dodecipher();return false;">解密</a>
</br>
</br>
所得明文:<input type="text" name="getPlain" value="<%=plain1 %>" />
</form>
</div>
<%@ include file="footer.jsp" %>
</body>
</html>
header.jsp(这个没什么意思,但还是给出来吧,给初学html的朋友一些借鉴)
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<div id="header" align="center">
<h1>RC4加密算法测试系统</h1>
<hr>
</div>
footer.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<div align="center">
<hr>
<table>
<tr><td>Powered by Tasu</td></tr>
<tr><td>Copyright@Tasusparty Studio 2009-2010 All rights reserved</td></tr>
</table>
</div>
styles.css(给出来省事一些,诸位看起来方便)
body{
margin:0px;
padding:0px;
background: #E6EAE9;
font-family: "Lucida Sans Unicode", "宋体", "新宋体", Arial, Verdana, serif;
color:#4f6b72;
font-size:12px;
line-height:150%;
}
#show{
margin:0px auto;
padding:0px;
width:200px;
height:400px
}
#header{
margin:30px auto;
}
处理的Servlet:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import core.ChangeCharset;
import core.RC4;
public class Manage extends HttpServlet {
public Manage() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK"); //设置输入编码格式
response.setContentType("text/html;charset=GBK"); //设置输出编码格式
String domethod=request.getParameter("domethod");
if(domethod.equals("encrypt")){
String plain=request.getParameter("plainText");
RC4 rc4=new RC4();
String cipher=rc4.encrypt(plain);
System.out.println(cipher);
request.setAttribute("cipher", cipher);
request.getRequestDispatcher("home.jsp").forward(request, response);
}
if(domethod.equals("decipher")){
String cipher=request.getParameter("cipherText");
RC4 rc4=new RC4();
String plain=rc4.encrypt(cipher);
request.setAttribute("plain1", plain);
request.getRequestDispatcher("home.jsp").forward(request, response);
}
}
public void init() throws ServletException {
// Put your code here
}
}(中网互赢 手机客户端)
㈢ RC4的原理
RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box的长度为256,密钥长度为Len。先来看看算法的初始化部分(用C代码表示):
其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];
参数2是密钥,其内容可以随便定义:char key[256];
参数3是密钥的长度,Len = strlen(key); /*初始化函数*/voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen){inti=0,j=0;chark[256]={0};unsignedchartmp=0;for(i=0;i<256;i++){s[i]=i;k[i]=key[i%Len];}for(i=0;i<256;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的长度. /*加解密*/voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen){inti=0,j=0,t=0;unsignedlongk=0;unsignedchartmp;for(k=0;k<Len;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函数中,调用顺序如下: intmain(){unsignedchars[256]={0},s2[256]={0};//S-boxcharkey[256]={justfortest};charpData[512]=这是一个用来加密的数据Data;unsignedlonglen=strlen(pData);inti;printf(pData=%s
,pData);printf(key=%s,length=%d
,key,strlen(key));rc4_init(s,(unsignedchar*)key,strlen(key));//已经完成了初始化printf(完成对S[i]的初始化,如下:
);for(i=0;i<256;i++){printf(%02X,s[i]);if(i&&(i+1)%16==0)putchar('
');}printf(
);for(i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{s2[i]=s[i];}printf(已经初始化,现在加密:
);rc4_crypt(s,(unsignedchar*)pData,len);//加密printf(pData=%s
,pData);printf(已经加密,现在解密:
);//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥rc4_crypt(s2,(unsignedchar*)pData,len);//解密printf(pData=%s
,pData);return0;}因此最终的完整程序是: //程序开始#include<stdio.h>#include<string.h>typedefunsignedlongULONG;/*初始化函数*/voidrc4_init(unsignedchar*s,unsignedchar*key,unsignedlongLen){inti=0,j=0;chark[256]={0};unsignedchartmp=0;for(i=0;i<256;i++){s[i]=i;k[i]=key[i%Len];}for(i=0;i<256;i++){j=(j+s[i]+k[i])%256;tmp=s[i];s[i]=s[j];//交换s[i]和s[j]s[j]=tmp;}}/*加解密*/voidrc4_crypt(unsignedchar*s,unsignedchar*Data,unsignedlongLen){inti=0,j=0,t=0;unsignedlongk=0;unsignedchartmp;for(k=0;k<Len;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];}}intmain(){unsignedchars[256]={0},s2[256]={0};//S-boxcharkey[256]={justfortest};charpData[512]=这是一个用来加密的数据Data;unsignedlonglen=strlen(pData);inti;printf(pData=%s
,pData);printf(key=%s,length=%d
,key,strlen(key));rc4_init(s,(unsignedchar*)key,strlen(key));//已经完成了初始化printf(完成对S[i]的初始化,如下:
);for(i=0;i<256;i++){printf(%02X,s[i]);if(i&&(i+1)%16==0)putchar('
');}printf(
);for(i=0;i<256;i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{s2[i]=s[i];}printf(已经初始化,现在加密:
);rc4_crypt(s,(unsignedchar*)pData,len);//加密printf(pData=%s
,pData);printf(已经加密,现在解密:
);//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥rc4_crypt(s2,(unsignedchar*)pData,len);//解密printf(pData=%s
,pData);return0;}//程序完
㈣ RC4算法的详细介绍
RC4加密算法
之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。
RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。假设S-box长度和密钥长度均为n。先来看看算法的初始化部分(用类C伪代码表示):
for (i=0; i<n; i++){
s[i]=i;
}
j=0;
for (i=0; i<n; i++)
{
j=(j+s[i]+k[i])%n;
swap(s[i], s[j]);
}
在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的:
i=j=0;
while (明文未结束)
{
++i%=n;
j=(j+s)%n;
swap(s, s[j]);
sub_k=s((s+s[j])%n);
}
得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。
由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。关于如何破解xor加密,请参看Bruce Schneier的Applied Cryptography一书的1.4节Simple XOR,在此我就不细说了。那么,RC4算法生成的子密钥序列是否会出现重复呢?经过我的测试,存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。
但在2001年就有以色列科学家指出RC4加密算法存在着漏洞,这可能对无线通信网络的安全构成威胁。
以色列魏茨曼研究所和美国思科公司的研究者发现,在使用“有线等效保密规则”(WEP)的无线网络中,在特定情况下,人们可以逆转RC4算法的加密过程,获取密钥,从而将已加密的信息解密。实现这一过程并不复杂,只需要使用一台个人电脑对加密的数据进行分析,经过几个小时的时间就可以破译出信息的全部内容。
专家说,这并不表示所有使用RC4算法的软件都容易泄密,但它意味着RC4算法并不像人们原先认为的那样安全。这一发现可能促使人们重新设计无线通信网络,并且使用新的加密算法。
㈤ 如何用rc4 加密算法对excel vba进行加密
我就是专门做破解工作的,没有说普通的加密很容易破解,你有密码里加入大小写,特殊符号以及空格,或者在加上几个其它国家的语言文子(比如日文)10位以上,这样就很难破解了,
如果这样不行的话,你用最新版本的RAR(压缩包加密)位数多一点,再加上大小写,特殊符号以及空格或者在加上几个其它国家的语言文字(比如日文)10位以上,目前基本无法破解,破解软件对这种远算只能达到一秒几次。
namespace CryptoRC4
{
using System;
using System.Text;
public class clsRC4Engine
{
private static long m_nBoxLen = 255;
protected clsRC4Engine()
{
}
private static void GetKeyBytes( string Key, out byte[] m_nBox )
{
long index2 = 0;
m_nBox = new byte[m_nBoxLen];
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
byte[] asciiBytes = Encoding.Convert(unicode,ascii, unicode.GetBytes( Key ));
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes,0,asciiBytes.Length)];
ascii.GetChars(asciiBytes,0,asciiBytes.Length,asciiChars,0);
long KeyLen = Key.Length;
for ( long count = 0; count < m_nBoxLen ; count ++ )
{
m_nBox[count] = (byte)count;
}
for ( long count = 0; count < m_nBoxLen ; count ++ )
{
index2 = (index2 + m_nBox[count] + asciiChars[ count % KeyLen ]) % m_nBoxLen;
byte temp = m_nBox[count];
m_nBox[count] = m_nBox[index2];
m_nBox[index2] = temp;
}
}
private static bool GetEncryptBytes( string sData, byte[] m_nBox,out byte[] EncryptedBytes )
{
EncryptedBytes = null;
bool toRet = true;
try
{
long i=0;
long j=0;
Encoding enc_default = Encoding.Unicode;
byte[] input = enc_default.GetBytes( sData );
EncryptedBytes = new byte[input.Length];
byte[] n_LocBox = new byte[m_nBoxLen];
m_nBox.CopyTo(n_LocBox,0);
long ChipherLen = input.Length + 1;
for ( long offset = 0; offset < input.Length ; offset++ )
{
i = ( i + 1 ) % m_nBoxLen;
j = ( j + n_LocBox[i] ) % m_nBoxLen;
byte temp = n_LocBox[i];
n_LocBox[i] = n_LocBox[j];
n_LocBox[j] = temp;
byte a = input[offset];
byte b = n_LocBox[(n_LocBox[i]+n_LocBox[j])% m_nBoxLen];
EncryptedBytes[offset] = (byte)((int)a^(int)b);
}
}
catch
{
EncryptedBytes = null;
toRet = false;
}
return toRet;
}
public static bool Encrypt( string sData, string Key, out string EncryptedString )
{
EncryptedString = null;
if( sData == null || Key == null ) return false;
byte[] m_nBox;
GetKeyBytes( Key, out m_nBox );
byte[] output;
if( GetEncryptBytes( sData, m_nBox, out output ) )
{
// Convert data to hex-data
EncryptedString = "";
for( int i = 0; i < output.Length; i++ )
EncryptedString += output[i].ToString( "X2" );
return true;
}
else
return false;
}
/// <summary>
/// Decrypt data using specific key
/// </summary>
/// <param name="EncryptedString"></param>
/// <param name="Key"></param>
/// <param name="sData"></param>
/// <returns></returns>
public static bool Decrypt( string EncryptedString, string Key, out string sData )
{
sData = null;
if( EncryptedString == null || Key == null ) return false;
else if( EncryptedString.Length % 2 != 0 ) return false;
byte[] m_nBox;
GetKeyBytes( Key, out m_nBox );
// Convert data from hex-data to string
byte[] bData = new byte[EncryptedString.Length / 2];
for( int i = 0; i < bData.Length; i++ )
bData[i] = Convert.ToByte( EncryptedString.Substring( i * 2, 2 ), 16 );
EncryptedString = Encoding.Unicode.GetString( bData );
byte[] output;
if( GetEncryptBytes( EncryptedString, m_nBox, out output ) )
{
sData = Encoding.Unicode.GetString( output );
return true;
}
else
return false;
}
}
}
调用:
//Encrypt data
string strEncryptedString;
if( clsRC4Engine.Encrypt( strValue, strKey, out strEncryptedString ) )
MessageBox.Show( strEncryptedString );
//Decrypt data
string strDecryptedString;
if( clsRC4Engine.Decrypt( strValue, strKey, out strDecryptedString ) )
MessageBox.Show( strDecryptedString );
另外一种
public static string encrypt_str( string str )
{
string s = "";
int i_Encrypt = ClsSetConst.m_Set_Encrypt;
char[] s_array = str.ToCharArray();
for(int i = 0; i < s_array.Length; i++)
{
int x = ((int)s_array[i]) + i_Encrypt;
s += (char)(x);
}
return s;
}
public void decript_str(string str)
{
string s = "";
int i_Encrypt = ClsSetConst.m_Set_Encrypt;
char[] s_array = str.ToCharArray();
for(int i = 0; i < s_array.Length; i++)
{
int x = ((int)s_array[i]) - i_Encrypt;
s += (char)x;
}
自己看看有没有输错的地方吧
㈥ 怎么在服务器端禁止使用rc4加密算法
.版本 2.子程序 加密为rc4, 文本型, 公开, 用RC4算法对文本进行加密.参数 加密的数据, 文本型, , 欲加密的文本.参数 加密密钥, 文本型, 可空, 用作加密的密码.局部变量 临时, 字节集.局部变量 s, 字节型, , "256".局部变量 k, 字节型, , "256"....
㈦ ssl安全 怎么禁用RC4加密算法
SCHANNEL\Protocols 子项
协议 的注册表项下 SCHANNEL
键用于的控件使用的协议支持由 Schannel.dll 文件,并限制该协议使用 TLS 服务器或 TLS 的客户端。
若要禁止使用的 SSL
3.0 或 TLS 1.0 之外的其他协议,请将 Enabled 值的 DWORD 鍊兼暟鎹改为 0x0 中下面的注册表项,在 协议 键下的每个:
目前的 Microsoft 消息队列使用的客户端和服务器之间只有 PCT 1.0
SCHANNEL\Ciphers 子项
密码 的注册表项下 SCHANNEL 键用于控制如 DES 或 RC4
对称算法的使用。 以下是在 密码 键下的有效注册表项。
SCHANNEL\Ciphers\RC4
128/128 子项:
rc4 128/128
此子项是指 128 位 RC4。
要允许此密码算法、 0xffffffff 到更改
启用 值的 DWORD 值数据,否则更改为 0x0 的 DWORD
值数据。 如果不配置 启用 值,启用了默认值。 此注册表项不能应用于不具备 SGC
证书
---------------------------------------------------------------------------------------
des:有好几种:0xffffffff 到更改 启用,否则更改为 0x0 ,不配置 启用
值,启用了默认值,但有很多不允许禁用的算法。。。
TLS 1.0 和SSL 3.0
:{}是要在regedit里建的值:
ssl_rsa_export_with_rc4_40_md5
{0x00,0x03}
ssl_rsa_with_rc4_128_md5
{0x00,0x04}
SSL_RSA_WITH_DES_CBC_SHA
{0x00,0x09}
ssl_rsa_with_3des_ede_cbc_sha
{0x00,0x0A}
ssl_rsa_export1024_with_des_cbc_sha
{0x00,0x62}
ssl_rsa_export1024_with_rc4_56_sha
{0x00,0x64}
TLS_RSA_WITH_DES_CBC_SHA
{0x00,0x09}
tls_rsa_with_3des_ede_cbc_sha
{0x00,0x0A}
tls_rsa_export1024_with_des_cbc_sha
{0x00,0x62
tls_rsa_export_with_rc4_40_md5
{0x00,0x03}
tls_rsa_with_rc4_128_md5
{0x00,0x04}
1
。。。。SCHANNEL\Ciphers\Triple
DES 128/128 子项:
三重 DES 168/168
2
。。。。SCHANNEL\Ciphers\RC2 56/56
子项:
DES 56/56
3
SCHANNEL\Hashes\MD5
子项:
md5
=====
例子:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA]
"Enabled"=dword:ffffffff
SCHANNEL\Protocols\PCT 1.0\Client
SCHANNEL\Protocols\PCT 1.0\Server
SCHANNEL\Protocols\SSL 2.0\Client
SCHANNEL\Protocols\SSL 2.0\Server
㈧ RC4 与 DES 哪个算法最安全
随机密钥加密算法:RC4
位密码算法:DES 三重DES(Triple-DES)仍然是很安全的,但是也只是在别无他法的情况下的一个较好的选择。显然高级加密标准(AES)是一个更好的加密算法,NIST用AES代替Triple-DES作为他们的标准(下面有更详细的讨论)。其他较好的算法包括另外两个AES的变种算法Twofish和Serpent-也称为CAST-128,它是效率和安全的完美结合。这几个算法不仅比DES更安全,而且也比DES的速度更快。为什么要使用一些又慢又不安全的算法呢?SHA1是一个哈希函数,而不是一个加密函数。作为一个哈希函数,SHA1还是相当优秀的,但是还需要几年的发展才能用作加密算法。如果你正在设计一个新系统,那么谨记你可能会在若干年后用SHA1代替目前的算法。我再重复一遍:只是可能。呵呵,希望能帮到你!谢谢望采纳哦!
㈨ 什么是RC4、RC5、AES
http://ke..com/view/2310288.htm
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所示。