當前位置:首頁 » 密碼管理 » rc4加密c

rc4加密c

發布時間: 2023-08-24 18:37:32

① 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;
}

② 請問誰能給我一個RC4演算法的完整程序嗎,我在用KEIL C編程時遇到問題了,希望能夠參考一下

我剛看了網路的RC4演算法 寫的太粗了 但是也差不多 可以看
樓主一分也不給 分不是問題 5分意思意思也就可以了 問題是你太吝嗇了
所以我也就不去給你抄書上的代碼了

大致可以告訴你 去圖書館找本 應用密碼學吧 rc4是流密碼的代表 是本書都有
而且rc4很簡單

RC4用的就是一個s-box 也就是是一個數組 不斷調整狀態 也就是改變這個數組
然後用這個數組得到密鑰流 密鑰流異或文明就是密文 密文再異或一次就是明文了

Rc4的代碼已經是簡單的不能再簡單了 就2部分 一個調整狀態 一個得出密鑰流
沒了 我實在不理解你還有什麼問題

③ 可以給我一個用RC4加密明文的例子嗎 謝謝啊

運行環境:Microsoft Visual Studio 6.0
語言:C++

#include<stdio.h>
#include<string>
void decrypt(char cipher[]);///////////////////////////////解密過程函數,根據輸入密鑰再一次生成密鑰流
void main()
{
printf("**************************RC4加解密程**************************\n");
char choose1,choose2;
do{
int s[256],t[256];
char k[256];/////////////////用戶輸入的密鑰
char plaintext[1024],ciphertext[1024];
printf("輸入密鑰:\n");
gets(k);
for(int i=0;i<256;i++)//////////////給位元組狀態矢量和可變長的密鑰數組賦值
{
s[i]=i;
t[i]=k[i%strlen(k)];
}
int j=0;
for(i=0;i<256;i++) //////使用可變長的密鑰數組初始化位元組狀態矢量數組s
{
int temp;
j=(j+s[i]+t[i])%256;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
printf("\n輸入要加密的字元串:\n");
gets(plaintext);
int m,n,key[256],q;
m=n=0;
printf("\n得到密文:\n");
for(i=0;i<strlen(plaintext);i++)/////////////由位元組狀態矢量數組變換生成密鑰流並對明文字元進行加密
{
int temp;

m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
ciphertext[i]=plaintext[i]^key[i];
printf("%c",ciphertext[i]);
}
ciphertext[i]='\0';
//解密
printf("\n是否對上面的密文進行解密?(y/n)\n");
scanf("%c",&choose2);
getchar();
while(choose2=='y'||choose2=='Y')
{
decrypt(ciphertext);///////////////////////////////解密過程函數
choose2='n';
}
printf("\n是否希望繼續使用程序?(y/n)\n");
scanf("%c",&choose1);
getchar();
}
while(choose1=='y'||choose1=='Y');
printf("\n****************************程序結束*****************************");
system("pause");
}
//解密函數,密鑰流的生成與加密相同
void decrypt(char cipher[])
{
int s[256],t[256];
int i;
char k[256];/////////////////用戶輸入的密鑰
char plaintext[1024];
printf("\n輸入密鑰:\n");
gets(k);
for(i=0;i<256;i++)//////////////給位元組狀態矢量和可變長的密鑰數組賦值
{

s[i]=i;
t[i]=k[i%strlen(k)];
}
int j=0;
for(i=0;i<256;i++) //////使用可變長的密鑰數組初始化位元組狀態矢量數組s
{
int temp;
j=(j+s[i]+t[i])%256;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
int m,n,key[256],q;
m=n=0;
printf("\n解密後所得到明文是:\n");
for(i=0;i<strlen(cipher);i++)/////////////由位元組狀態矢量數組變換生成密鑰流並對密文字元進行解密
{
int temp;
m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
plaintext[i]=cipher[i]^key[i];
printf("%c",plaintext[i]);
}
printf("\n");
}

④ OpenSSL 入門:密碼學基礎知識


本文是使用 OpenSSL 的密碼學基礎知識的兩篇文章中的第一篇,OpenSSL 是在 Linux 和其他系統上流行的生產級庫和工具包。(要安裝 OpenSSL 的最新版本,請參閱 這里 。)OpenSSL 實用程序可在命令行使用,程序也可以調用 OpenSSL 庫中的函數。本文的示常式序使用的是 C 語言,即 OpenSSL 庫的源語言。

本系列的兩篇文章涵蓋了加密哈希、數字簽名、加密和解密以及數字證書。你可以從 我的網站 的 ZIP 文件中找到這些代碼和命令行示例。

讓我們首先回顧一下 OpenSSL 名稱中的 SSL。

安全套接字層 (Secure Socket Layer)(SSL)是 Netscape 在 1995 年發布的一種加密協議。該協議層可以位於 HTTP 之上,從而為 HTTPS 提供了 S: 安全(secure)。SSL 協議提供了各種安全服務,其中包括兩項在 HTTPS 中至關重要的服務:

SSL 有多個版本(例如 SSLv2 和 SSLv3),並且在 1999 年出現了一個基於 SSLv3 的類似協議 傳輸層安全性(Transport Layer Security)(TLS)。TLSv1 和 SSLv3 相似,但不足以相互配合工作。不過,通常將 SSL/TLS 稱為同一協議。例如,即使正在使用的是 TLS(而非 SSL),OpenSSL 函數也經常在名稱中包含 SSL。此外,調用 OpenSSL 命令行實用程序以 openssl 開始。

除了 man 頁面之外,OpenSSL 的文檔是零零散散的,鑒於 OpenSSL 工具包很大,這些頁面很難以查找使用。命令行和代碼示例可以將主要主題集中起來。讓我們從一個熟悉的示例開始(使用 HTTPS 訪問網站),然後使用該示例來選出我們感興趣的加密部分進行講述。

此處顯示的 client 程序通過 HTTPS 連接到 Google:

可以從命令行編譯和執行該程序(請注意 -lssl 和 -lcrypto 中的小寫字母 L):

該程序嘗試打開與網站 www.google.com 的安全連接。在與 Google Web 伺服器的 TLS 握手過程中,client 程序會收到一個或多個數字證書,該程序會嘗試對其進行驗證(但在我的系統上失敗了)。盡管如此,client 程序仍繼續通過安全通道獲取 Google 主頁。該程序取決於前面提到的安全工件,盡管在上述代碼中只著重突出了數字證書。但其它工件仍在幕後發揮作用,稍後將對它們進行詳細說明。

通常,打開 HTTP(非安全)通道的 C 或 C++ 的客戶端程序將使用諸如文件描述符或網路套接字之類的結構,它們是兩個進程(例如,這個 client 程序和 Google Web 伺服器)之間連接的端點。另一方面,文件描述符是一個非負整數值,用於在程序中標識該程序打開的任何文件類的結構。這樣的程序還將使用一種結構來指定有關 Web 伺服器地址的詳細信息。

這些相對較低級別的結構不會出現在客戶端程序中,因為 OpenSSL 庫會將套接字基礎設施和地址規范等封裝在更高層面的安全結構中。其結果是一個簡單的 API。下面首先看一下 client 程序示例中的安全性詳細信息。

在與 Web 伺服器握手期間,client 程序會接收一個或多個數字證書,以認證伺服器的身份。但是,client 程序不會發送自己的證書,這意味著這個身份驗證是單向的。(Web 伺服器通常配置為 需要客戶端證書)盡管對 Web 伺服器證書的驗證失敗,但 client 程序仍通過了連接到 Web 伺服器的安全通道繼續獲取 Google 主頁。

為什麼驗證 Google 證書的嘗試會失敗?典型的 OpenSSL 安裝目錄為 /etc/ssl/certs,其中包含 ca-certificates.crt 文件。該目錄和文件包含著 OpenSSL 自帶的數字證書,以此構成 信任庫(truststore)。可以根據需要更新信任庫,尤其是可以包括新信任的證書,並刪除不再受信任的證書。

client 程序從 Google Web 伺服器收到了三個證書,但是我的計算機上的 OpenSSL 信任庫並不包含完全匹配的證書。如目前所寫,client 程序不會通過例如驗證 Google 證書上的數字簽名(一個用來證明該證書的簽名)來解決此問題。如果該簽名是受信任的,則包含該簽名的證書也應受信任。盡管如此,client 程序仍繼續獲取頁面,然後列印出 Google 的主頁。下一節將更詳細地介紹這些。

讓我們從客戶端示例中可見的安全工件(數字證書)開始,然後考慮其他安全工件如何與之相關。數字證書的主要格式標準是 X509,生產級的證書由諸如 Verisign 的 證書頒發機構(Certificate Authority)(CA)頒發。

數字證書中包含各種信息(例如,激活日期和失效日期以及所有者的域名),也包括發行者的身份和數字簽名(這是加密過的加密哈希值)。證書還具有未加密的哈希值,用作其標識指紋。

哈希值來自將任意數量的二進制位映射到固定長度的摘要。這些位代表什麼(會計報告、小說或數字電影)無關緊要。例如, 消息摘要版本 5(Message Digest version 5)(MD5)哈希演算法將任意長度的輸入位映射到 128 位哈希值,而 SHA1( 安全哈希演算法版本 1(Secure Hash Algorithm version 1))演算法將輸入位映射到 160 位哈希值。不同的輸入位會導致不同的(實際上在統計學上是唯一的)哈希值。下一篇文章將會進行更詳細的介紹,並著重介紹什麼使哈希函數具有加密功能。

數字證書的類型有所不同(例如根證書、中間證書和最終實體證書),並形成了反映這些證書類型的層次結構。顧名思義,根證書位於層次結構的頂部,其下的證書繼承了根證書所具有的信任。OpenSSL 庫和大多數現代編程語言都具有 X509 數據類型以及處理此類證書的函數。來自 Google 的證書具有 X509 格式,client 程序會檢查該證書是否為 X509_V_OK。

X509 證書基於 公共密鑰基礎結構(public-key infrastructure)(PKI),其中包括的演算法(RSA 是佔主導地位的演算法)用於生成密鑰對:公共密鑰及其配對的私有密鑰。公鑰是一種身份: Amazon 的公鑰對其進行標識,而我的公鑰對我進行標識。私鑰應由其所有者負責保密。

成對出現的密鑰具有標准用途。可以使用公鑰對消息進行加密,然後可以使用同一個密鑰對中的私鑰對消息進行解密。私鑰也可以用於對文檔或其他電子工件(例如程序或電子郵件)進行簽名,然後可以使用該對密鑰中的公鑰來驗證簽名。以下兩個示例補充了一些細節。

在第一個示例中,Alice 將她的公鑰分發給全世界,包括 Bob。然後,Bob 用 Alice 的公鑰加密郵件,然後將加密的郵件發送給 Alice。用 Alice 的公鑰加密的郵件將可以用她的私鑰解密(假設是她自己的私鑰),如下所示:

理論上可以在沒有 Alice 的私鑰的情況下解密消息,但在實際情況中,如果使用像 RSA 這樣的加密密鑰對系統,則在計算上做不到。

現在,第二個示例,請對文檔簽名以證明其真實性。簽名演算法使用密鑰對中的私鑰來處理要簽名的文檔的加密哈希:

假設 Alice 以數字方式簽署了發送給 Bob 的合同。然後,Bob 可以使用 Alice 密鑰對中的公鑰來驗證簽名:

假若沒有 Alice 的私鑰,就無法輕松偽造 Alice 的簽名:因此,Alice 有必要保密她的私鑰。

在 client 程序中,除了數字證書以外,這些安全性都沒有明確展示。下一篇文章使用使用 OpenSSL 實用程序和庫函數的示例填充更多詳細的信息。

同時,讓我們看一下 OpenSSL 命令行實用程序:特別是在 TLS 握手期間檢查來自 Web 伺服器的證書的實用程序。調用 OpenSSL 實用程序可以使用 openssl 命令,然後添加參數和標志的組合以指定所需的操作。

看看以下命令:

該輸出是組成 加密演算法套件(cipher suite)()的相關演算法的列表。下面是列表的開頭,加了澄清首字母縮寫詞的注釋:

下一條命令使用參數 s_client 將打開到 www.google.com 的安全連接,並在屏幕上顯示有關此連接的所有信息:

諸如 Google 之類的主要網站通常會發送多個證書進行身份驗證。

輸出以有關 TLS 會話的摘要信息結尾,包括加密演算法套件的詳細信息:

client 程序中使用了協議 TLS 1.2,Session-ID 唯一地標識了 openssl 實用程序和 Google Web 伺服器之間的連接。Cipher 條目可以按以下方式進行解析:

加密演算法套件正在不斷發展中。例如,不久前,Google 使用 RC4 流加密演算法(RSA 的 Ron Rivest 後來開發的 Ron』s Cipher 版本 4)。 RC4 現在有已知的漏洞,這大概部分導致了 Google 轉換為 AES128。

我們通過安全的 C Web 客戶端和各種命令行示例對 OpenSSL 做了首次了解,使一些需要進一步闡明的主題脫穎而出。 下一篇文章會詳細介紹 ,從加密散列開始,到對數字證書如何應對密鑰分發挑戰為結束的更全面討論。

via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-1

作者: Marty Kalin 選題: lujun9972 譯者: wxy 校對: wxy

⑤ 求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 密碼c語言 求高手看看哪個語句錯了,使其執行不了

void re_RC4(unsigned char *S,char *key)
{
unsigned char T[255]={0}; //問題在這,你的re_T第一個參數是unsigned char *,你傳遞的參數是 //char,所以不對
re_S(S);
re_T(T,key);
re_Sbox(S,T);
}

⑦ 對稱加密演算法的加密演算法主要有哪些

1、3DES演算法

3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,M代表明文,C代表密文,這樣:

3DES加密過程為:C=Ek3(Dk2(Ek1(M)))

3DES解密過程為:M=Dk1(EK2(Dk3(C)))

2、Blowfish演算法

BlowFish演算法用來加密64Bit長度的字元串。

BlowFish演算法使用兩個「盒」——unsignedlongpbox[18]和unsignedlongsbox[4,256]。

BlowFish演算法中,有一個核心加密函數:BF_En(後文詳細介紹)。該函數輸入64位信息,運算後,以64位密文的形式輸出。用BlowFish演算法加密信息,需要兩個過程:密鑰預處理和信息加密。

分別說明如下:

密鑰預處理:

BlowFish演算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化演算法如下:

1)用sbox填充key_sbox

2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。

比如說:選的key是"abcdefghijklmn"。則異或過程為:

key_pbox[0]=pbox[0]abcdefgh;

key_pbox[1]=pbox[1]ijklmnab;

…………

…………

如此循環,直到key_pbox填充完畢。

3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1],i=0;

4)用BF_En加密替換後的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3];

5)i+2,繼續第4步,直到key_pbox全部被替換;

6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。

信息加密就是用函數把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換。

3、RC5演算法

RC5是種比較新的演算法,Rivest設計了RC5的一種特殊的實現方式,因此RC5演算法有一個面向字的結構:RC5-w/r/b,這里w是字長其值可以是16、32或64對於不同的字長明文和密文塊的分組長度為2w位,r是加密輪數,b是密鑰位元組長度。

(7)rc4加密c擴展閱讀:

普遍而言,有3個獨立密鑰的3DES(密鑰選項1)的密鑰長度為168位(三個56位的DES密鑰),但由於中途相遇攻擊,它的有效安全性僅為112位。密鑰選項2將密鑰長度縮短到了112位,但該選項對特定的選擇明文攻擊和已知明文攻擊的強度較弱,因此NIST認定它只有80位的安全性。

對密鑰選項1的已知最佳攻擊需要約2組已知明文,2部,2次DES加密以及2位內存(該論文提到了時間和內存的其它分配方案)。

這在現在是不現實的,因此NIST認為密鑰選項1可以使用到2030年。若攻擊者試圖在一些可能的(而不是全部的)密鑰中找到正確的,有一種在內存效率上較高的攻擊方法可以用每個密鑰對應的少數選擇明文和約2次加密操作找到2個目標密鑰中的一個。

熱點內容
易語言寫ip全局代理伺服器 發布:2025-01-26 15:04:01 瀏覽:668
gm命令在哪個文件夾 發布:2025-01-26 15:03:12 瀏覽:307
javadate類 發布:2025-01-26 14:58:54 瀏覽:352
領航s1配置怎麼樣 發布:2025-01-26 09:58:10 瀏覽:763
公司區域網搭建伺服器搭建 發布:2025-01-26 09:16:56 瀏覽:433
android裁剪圓形圖片 發布:2025-01-26 09:05:56 瀏覽:411
小貸源碼 發布:2025-01-26 08:20:58 瀏覽:536
更換電腦名登錄伺服器 發布:2025-01-26 07:56:52 瀏覽:240
後台phpjava 發布:2025-01-26 07:12:34 瀏覽:657
微信解綁密碼是什麼 發布:2025-01-26 06:50:07 瀏覽:734