A. 求教一個C++問題,RC4加密解密中遇到的問題。
使用gets()函數來讀取數據,裡面的空格就會一起被讀取了。
B. 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;}//程序完
C. RC4的介紹
RC4加密演算法是大名鼎鼎的RSA三人組中的頭號人物Ronald Rivest在1987年設計的密鑰長度可變的流加密演算法簇。之所以稱其為簇,是由於其核心部分的S-box長度可為任意,但一般為256位元組。該演算法的速度可以達到DES加密的10倍左右,且具有很高級別的非線性。RC4起初是用於保護商業機密的。但是在1994年9月,它的演算法被發布在互聯網上,也就不再有什麼商業機密了。RC4也被叫做ARC4(Alleged RC4——所謂的RC4),因為RSA從來就沒有正式發布過這個演算法。
D. RC4 與信息安全問題
一樓說的不正確
RC4 1976年就出現了。不早了吧。。RC6都參加過AES的篩選你說怎麼回事
RC4-應用很廣泛。。SSL(包含),WEP等都是採用RC4演算法
以色列的那幫XX說的是RC4的加密演算法和密鑰系統有缺陷。
當密鑰小於128位的時候--這里說的是bit..也就是16位元組
強度不高很容易總結出規律。
原因是多方面的最關鍵的還是。密鑰系統過於簡單。復雜的話那速度不就慢了嘛。還有加密解密演算法過於簡單。。他是XOR演算法。在XOR一遍就是解密
密碼學家也說了。密鑰高於128還是比較安全的。
當然RC4演算法最高支持256位元組也就是2048位密鑰
最好採用復雜的密鑰生成器。。。
一般情況下..是輸入一段XX-然後Md5-HASH用HASH當做密鑰...
比如y0da protecter就是採用此類方法來加密的
關於安全性問題就出現在windows上了。windows下WIFI密鑰通常只能輸入13位元組。遠達不到16位元組的。安全性。
所以會產生重復和碰撞。--因為用了xor。所以出來混的總要還的。。:P
改進方法3種:
1.不需要改演算法。盡量的使用長密鑰
2.加強加密運算,比如原來是xor,你可以加點add拉,shr,shl,sub
雖然大作用起不到.但是在別人不知道你改進演算法的情況下還是可以起到一定作用的
3.改進密鑰系統...說實話.這個不太熟悉.因為加密演算法的問題所以這里不是很好改...
一般來說使用長密鑰在還是有一定的安全性的...
如果實在沒招的話可以採用其他演算法ECC雖然不錯但是也有漏洞可以攻破
推薦看<<經典密碼學與現代密碼學>>
從古典演算法到現在使用的演算法。。包括原理很攻破
E. pdf不能列印,所謂的RC4加密演算法搞鬼!有無辦法讓我列印我的PDF文件啊求助
基本沒辦法,受保護的PDF是不能編輯和列印的,這涉及到知識產權問題
F. 怎樣把電腦上的應用軟體加密
1、首先選擇滑鼠打開電腦並在鍵盤上輸入gpedit.msc。
G. 如何用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;
}
自己看看有沒有輸錯的地方吧
H. RC4的漏洞
由於RC4演算法加密是採用的xor,所以,一旦子密鑰序列出現了重復,密文就有可能被破解。關於如何破解xor加密,請參看Bruce Schneier的Applied Cryptography一書的1.4節Simple XOR,在此我就不細說了。那麼,RC4演算法生成的子密鑰序列是否會出現重復呢?由於存在部分弱密鑰,使得子密鑰序列在不到100萬位元組內就發生了完全的重復,如果是部分重復,則可能在不到10萬位元組內就能發生重復,因此,推薦在使用RC4演算法時,必須對加密密鑰進行測試,判斷其是否為弱密鑰。其不足主要體現於,在無線網路中IV(初始化向量)不變性漏洞。
而且,根據目前的分析結果,沒有任何的分析對於密鑰長度達到128位的RC4有效,所以,RC4是目前最安全的加密演算法之一,大家可以放心使用!
分布式代碼管理網站Github從2015年1月5日將停止對RC4的支持,RC4作為一種老舊的驗證和加密演算法易於受到黑客攻擊。這意味著,用戶在使用Windows XP系統上的IE瀏覽器時將無法進入github.com網站