導航:首頁 > 文檔加密 > rc4加密兩次可以回原位嗎

rc4加密兩次可以回原位嗎

發布時間:2022-09-18 11:03:47

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網站

閱讀全文

與rc4加密兩次可以回原位嗎相關的資料

熱點內容
瑜伽pdf下載地址 瀏覽:252
小花貓app改名叫什麼 瀏覽:837
編程器固件修改 瀏覽:523
沈陽技校有程序員嗎 瀏覽:300
各行app的基金有什麼不一樣嗎 瀏覽:62
python編譯器怎麼裝 瀏覽:73
新浪php筆試題 瀏覽:138
新時達伺服器如何自學習 瀏覽:27
程序中什麼命令用來輸入單字元 瀏覽:59
php是否有數據 瀏覽:141
虛擬雲伺服器是什麼意思 瀏覽:279
vb是編譯性語言嗎 瀏覽:209
json格式用什麼編譯器 瀏覽:319
word轉pdf代碼 瀏覽:802
單片機中如何編程 瀏覽:739
cad常見的快捷命令 瀏覽:625
伺服器端有什麼 瀏覽:325
文件夾正在使用如何重命名 瀏覽:378
單片機觸摸 瀏覽:875
qq收藏夾在手機哪個文件夾 瀏覽:755