曾經實驗室的帶動,加上最近在上網路安全與管理的專業選修課,對加密演算法有了濃厚的興趣。老師留了一次作業,用自己的學號為密鑰,加密一句話,使用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演算法的原理,最好用通俗的語言講解,能打下比方更好了(本人能看懂一點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的RC4加密演算法
RC4加密演算法是大名鼎鼎的RSA三人組中的頭號人物Ronald Rivest在1987年設計的密鑰長度可變的流加密演算法簇。之所以稱其為簇,是由於其核心部分的S-box長度可為任意,但一般為256位元組。該演算法的速度可以達到DES加密的10倍左右,且具有很高級別的非線性。RC4起初是用於保護商業機密的。但是在1994年9月,它的演算法被發布在互聯網上,也就不再有什麼商業機密了。RC4也被叫做ARC4(Alleged RC4——所謂的RC4),因為RSA從來就沒有正式發布過這個演算法。
⑸ RC4 與 DES 哪個演算法最安全
隨機密鑰加密演算法:RC4
位密碼演算法:DES 三重DES(Triple-DES)仍然是很安全的,但是也只是在別無他法的情況下的一個較好的選擇。顯然高級加密標准(AES)是一個更好的加密演算法,NIST用AES代替Triple-DES作為他們的標准(下面有更詳細的討論)。其他較好的演算法包括另外兩個AES的變種演算法Twofish和Serpent-也稱為CAST-128,它是效率和安全的完美結合。這幾個演算法不僅比DES更安全,而且也比DES的速度更快。為什麼要使用一些又慢又不安全的演算法呢?SHA1是一個哈希函數,而不是一個加密函數。作為一個哈希函數,SHA1還是相當優秀的,但是還需要幾年的發展才能用作加密演算法。如果你正在設計一個新系統,那麼謹記你可能會在若干年後用SHA1代替目前的演算法。我再重復一遍:只是可能。呵呵,希望能幫到你!謝謝望採納哦!
⑹ RSA的優缺點和RC4的優缺點
這兩者唯一的相同點是設計者中都包含了MIT的Ron Revist教授。
RSA是公鑰密碼演算法,優點:不用事先通過秘密信道傳遞密鑰,可以用於數字簽名。缺點:速度慢
RC4是序列密碼演算法,優點:速度快,缺點:需要事先秘密地傳遞密鑰。
⑺ rc4演算法該怎樣寫一個完整的程序代碼用的是c/c++都行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned long ULONG;
void rc4_init(unsigned char *s, unsigned char *data,unsigned Len) { //初始化函數
int i,j;
unsigned char k[256] = {0},tmp;
for(i = 0;i < 256;i++) {
s[i] = i;
k[i] = data[i%Len];
}
for(i = 0; i < 256; i++) {
j = (j + s[i] + k[i])%Len;
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;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];
}
}
int main() {
unsigned char s[256] = {0},st[256] = {0}; //S-box
char key[256] = "just for test";
char pData[512] = "待加密數據Data";
ULONG len = strlen(pData);
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(int i = 0; i < 256; i++) {
printf("%-3d ",s[i]);
}
printf("\n\n");
for(i = 0; i < 256;i++) { //用st[i]暫時保留經過初始化的s[i],很重要的!!!
st[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(st,(unsigned char *)pData,len);//解密
printf("pData = %s\n\n",pData);
return 0;
}
⑻ 加密演算法:AES DES RC4 Rabbit TripleDes 那個更好它們分
DES不夠安全。AES, TripleDes, RC4都可以。 Rabbit沒聽說過。
除了Rabbit,其他都是單鑰體制的加密演算法。就是用來加密而已。
一般的加密系統應該包括密鑰產生,分配和管理的一個系統,分配的時候還會用到公鑰體制用來加密密鑰和傳輸密鑰並用來簽名。經常用的公鑰演算法是RSA。密鑰是有時間限制的。用了時間太長了就得重新換一個避免被破解掉。