導航:首頁 > 文檔加密 > 課程設計文件加密解密

課程設計文件加密解密

發布時間:2023-07-25 14:52:06

A. 使用高級語言(C、C++、C#語言)實現一個加密/解密程序,調試並通過該程序。

同意一樓的看法,要不你就要赫夫曼編碼原理吧,這個比較簡單,實現也比較容易;根據字元出現的頻率作為字元權值,利用Huffman演算法進行處理,形成Huffman樹,得到Huffman碼,利用Huffman碼對字元進行加密,已二進制的形式存儲到磁碟。 再利用Huffman碼對加密後的文件解密。

#include<stdio.h>

typedef struct LNode{ /*-------------鏈表-------------------*/

int data;

struct LNode *next;

}LNode,*Linklist;

typedef struct Character{ /*-------------字元結構體-------------*/

char data; /*--------------字元值----------------*/

int frequency; /*-------------字元出現頻率-----------*/

}Character;

typedef struct HTNode{ /*-------------哈夫曼接點-------------*/

char data; /*-------------接點值-----------------*/

unsigned int weight; /*--------------權值------------------*/

unsigned int parent,lchild,rchild;

}HTNode,*HuffmanTree;

Linklist L; /*-------------鏈表頭接點--------------*/

Character T[256]; /*-----存放信息中出現的字元(不含漢字)----*/

HuffmanTree HT; /*--------------存放哈夫曼接點--------------*/

char *HC[257],*HA[256]; /*------HC中緊密存放哈夫曼編碼,HA中按字元值位置存放該字元的編碼,如A存放於HA中第65號元---*/

int len=0; /*-------------信息中出現的字元數量-----------*/

int s1,s2;

int i,j;

char ch;

char Infile[10],Outfile[10],decfile[10]; /*------分別為源信息文件,加密後的2進制文件(解密源文件),解密後的文件------*/

FILE *fp,*fin,*fout;

void Create_L(int n) /*------對有n接點建一條帶頭接點的鏈表(頭插法)-----*/

{

int i;

Linklist p,k;

L=(Linklist)malloc(sizeof(LNode));

k=L;

for(i=1;i<=n;i++)

{

p=(Linklist)malloc(sizeof(LNode));

p->next=NULL;

p->data=i;

k->next=p;k=p;

}

}

void Init() /*-------初始化,統計Infile中的字元數目len及每個字元出現的頻率------*/

{ /*-------將這len個字元存於T[0]到T[len-1]中,然後按頻率值將這len個字元按升序排列------*/

void QuickSort(Character A[],int p,int r);

printf("Input the Infilename:\n");

scanf("%s",Infile);

if((fp=fopen(Infile,"r"))==NULL)

{

printf("Cannot open Infile!\n");

exit(0);

}

for(i=0;i<256;i++)

{

T[i].data=i;

T[i].frequency=0;

}

while(!feof(fp))

{

ch=fgetc(fp);

T[ch].frequency++;

}

for(i=0,j=0;i<256;i++)

{

while(!T[i].frequency&&i<256)

T[i++].data=0;

if(i<256)

T[j++]=T[i];

}

len=j;

Create_L(len);

QuickSort(T,0,len-1);

fclose(fp);

}

void QuickSort(Character A[],int p,int r) /*--------冒泡法對A數組元素按頻率升序排列---------*/

{

Character t;

for(i=p;i<r;i++)

for(j=p;j<r-i;j++)

if(A[j].frequency>A[j+1].frequency)

{

t=A[j]; A[j]=A[j+1]; A[j+1]=t;

}

}

void Select() /*------------取出鏈表的前兩個權值最小的元素,將新增元素按升序規則插於鏈表-------*/

{

Linklist p,q;

int w,t;

p=L->next;

s1=p->data;

q=p->next;

s2=q->data;

w=HT[s1].weight+HT[s2].weight;

q->data=i;

L->next=q;

free(p);

while(q->next)

{

if(w>HT[q->next->data].weight)

{ t=q->data;q->data=q->next->data;q->next->data=t;}

q=q->next;

}

}

void HuffmanCoding(int n) /*-------對n種字元進行編碼存於*HA[257]中---------*/

{

int m,c,f,start;

int lencd;

HuffmanTree p;

char *cd;

if(n<=1) return;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(p=HT+1,i=1;i<=n;++i,++p)

{

p->data=T[i-1].data;

p->weight=T[i-1].frequency;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(;i<=m;++i,++p)

{

p->data=0;

p->weight=0;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(i=n+1;i<=m;++i)

{

Select();

HT[s1].parent=i;

HT[s2].parent=i;

HT[i].lchild=s1;

HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

}

cd=(char *)malloc(n*sizeof(char));

for(start=0;start<n;start++) cd[i]='\0';

for(i=1;i<=n;++i)

{

start=0;

for(c=i,f=HT[i].parent;f!=0;f=HT[f].parent,c=HT[c].parent)

{

if(HT[f].lchild==c)

cd[start++]='0';

else

cd[start++]='1';

}

lencd=start;

HC[i]=(char *)malloc((lencd+1)*sizeof(char));

ch=HT[i].data;

HA[ch]=(char *)malloc((lencd+1)*sizeof(char));

for(start=lencd-1,j=0;start>=0;start--)

{

HC[i][j]=cd[start];

j++;

}

HC[i][j]='\0';

strcpy(HA[ch],HC[i]);

}

free(cd);

}

void Encrytion() /*-------按HA中的編碼把Infile文件中的每一個字元翻譯成2進制文件存於outfile文件中----*/

{

printf("Input the outfilename:\n");

scanf("%s",Outfile);

if((fout=fopen(Outfile,"a"))==NULL)

{

printf("Cannot open outfile!\n");

exit(0);

}

if((fin=fopen(Infile,"r"))==NULL)

{

printf("Cannot open Infile in the Encrytion!\n");

exit(0);

}

while(!feof(fin))

{

ch=fgetc(fin);

fputs(HA[ch],fout);

}

fclose(fin);

fclose(fout);

}

void Decryption() /*--------對存於outfile文件中的密文解碼,從哈夫曼樹的根接點按0,1分別選擇左右子樹,

直到葉子接點,輸出葉子接點值-----*/

{

int m=2*len-1;

if((fin=fopen(Outfile,"r"))==NULL)

{

printf("Cannot open sourcefile!\n");

exit(0);

}

printf("Input the decfile!\n");

scanf("%s",decfile);

if((fout=fopen(decfile,"a"))==NULL)

{

printf("Cannot open decfile!\n");

exit(0);

}

while(!feof(fin))

{

i=m;

while(HT[i].lchild&&HT[i].rchild)

{

ch=fgetc(fin);

if(ch=='0') i=HT[i].lchild;

else if(ch=='1') i=HT[i].rchild;

else

{

printf("END!\n");

exit(0);

}

}

printf("%c",HT[i].data);

fprintf(fout,"%c",HT[i].data);

}

fclose(fin);

fclose(fout);

}

/*----------------主函數----------------------*/

void main()

{

void Init(); /*---------------聲明部分-------------------*/

void HuffmanCoding(int n);

void Encrytion();

void Decryption();

Init(); /*--------------初始化函數------------------*/

HuffmanCoding(len); /*--------------編碼函數--------------------*/

Encrytion(); /*--------------加密函數--------------------*/

Decryption(); /*--------------解密函數--------------------*/

}

B. 密碼鎖課程設計

軟體狗[Dongles]

1、認識軟體狗。[首先我對軟體狗作一簡單介紹,在後面我們將對各種軟體狗的加密和解密做詳細的講解。]

軟體狗是插在微機並行口上的一個軟體保護裝置,它包括主機檢查程序和密鑰(也稱加密盒)兩部分。主機檢查程序就是前面說的加密代碼的一部分,加密盒是用來存放密碼的。一般來說,軟體狗插在並行口上,不會影響列印機的正常工作。常見的軟體狗加密盒外形,如兩個一公一母的D行25針連接器倒接在一起,公頭(DB25/M)插在並行口上,母頭(DB25/F)可接列印機,相當於原來的並行口。整個軟體狗的硬體電路板就在這約5厘米見方的加密盒子里。
電路板上的公頭(DB25/F)之間的管腳是一一對應、直接相聯結的,以保證並行口的作用不變。存儲密碼或起信號加密變換作用的器件及其它輔助元件就跨接在這25根線上面,應用程序以特定的方式跟他們溝通、核對。除了某些設計不良的情況之外,一般不會影響列印機的正常工作,列印機工作時也不會影響它們。
為了防止程序被非法復制,所做的加密保護措施一般都包括兩部分。首先是要有保存密碼數據的載體,即密鑰;其次是夾雜在應用程序中的主機檢查程序,即加密代碼。密鑰應該能保證不易被解密、復制;如一般用磁碟做加密時,加密部分無法用一般的工具復制。另外,當檢查程序用特殊方法去讀密碼時,密碼應該能很容易地被讀出,而不致影響應用程序的正常執行。當發現密碼不對或密鑰不存在時,就讓主機掛起、重新起動或採用被的措施。

軟體狗經歷的「時代」
軟體狗的發展經歷了好幾代,至2001年初就已發展到了第四代。
第一代是存儲器型的加密鎖。這是最有歷史的加密鎖,內部只有存儲體,廠商只能對鎖進行讀、寫。軟體狗起信號加密變換作用的器件,最多隻簡單採用一些電阻、二極體等,檢查方法也比較簡單,很容易被人解密.常見的有原金天地的「軟體狗」、深思洛克的Keypro型、Rainbow的Cplus等。這種鎖的主要特點是廠商可以預先把自己的保密數據設置到鎖內,然後在軟體運行時隨機讀取,這樣防止了解密者通過簡單重復並口數據來解密,但解密者進一步分析一下數據規律就可以解決了,這就是常說的「埠」層的數據分析。這種加密鎖原理非常簡單,是種正在被逐步淘汰的產品,但是其原料成本極低,即使在很低的價位也有很好的利潤,加密廠商一般都不願放棄這種鎖;而很多廠商由於成本原因又不得不採用,因此這種鎖仍有一定的市場份額;
第二代是演算法不公開的加密鎖。硬體內部增加了單片機,即所謂內置CPU,廠商主要是利用演算法功能進行加密。加密鎖通常還增加了一些輔助功能,比如倒計數器、遠程升級等。軟體狗採用了低功耗TTL,COMS等邏輯元件,在電路上做了一些加密工作,檢查時也要比第一代軟體狗多一道手續,解密的難度自然也增加了。常見的有深思洛克的「深思Ⅰ」型,彩虹天地的SuperPro、微狗,ALADDIN的MemoHASP等。利用單片機,軟體與鎖之間的數據通訊建立了一個保密協議,數據都是經過加密的,解密者就難以分析出數據內容和規律了,因此對於這種鎖的數據分析就不是停留在「埠」層了,解密者轉向了「功能」層,就是對軟體中的函數調用進行分析。為了抵擋功能層的數據分析,這種鎖來了個「軟硬」兼施的策略。
「軟」的是指驅動程序內反跟蹤、外殼加密等等軟體工作,讓解密者難以在功能層上模擬,誰都靠的是對操作系統、微機系統的精確理解。誰都無法決勝,結果是加密驅動程序在不斷更新、膨脹。
「硬」的就是加密鎖內的演算法功能,這大大增加了解密難度,這是掌握在加密者手中的武器。但是,加密者只能設置演算法的參數,即所謂內含多少種演算法可選,而演算法內容並不知道。這樣就限制了廠商對演算法的使用,要麼預先記錄演算法結果然後在軟體運行時核對(使用碼表);要麼在軟體中至少變換兩次然後比較結果是否一致。如果解密者截獲這些數據,通過統計、分析就有可達到解密目的;
第三代加密鎖,即所謂「可編程」的加密鎖。1999年初,以北京深思洛克為代表推出了第三代加密鎖,「可編程」加密鎖概念的推出是軟體加密技術的一次進步。「可編程」加密鎖設計初衷是希望用戶能夠將軟體中重要的代碼或模塊「移植」到加密保護設備中運行,使軟體與加密鎖實現真正無縫鏈接。但由於成本限制,早期推出的幾款「可編程」加密鎖採用的低檔單片機給 「可編程」性造成了很大的局限,主要表現在:1、演算法變換的復雜度不夠高,2、指令編碼空間較小,3、程序區的空間較小。這些局限性使得用戶根本不可能利用「可編程」加密鎖實現理想的高強度加密方案。 軟體狗採用了PAL(Programmable Array Logic)、PEEL(Programmable Electrically Erasable Logic Device)、GAL(Generic Array Logic)等可編程器件,但目前流行的期間大概要算串列讀寫的EEPROM(Serial Electrically Erasable PROM)了。這些器件由於密碼編制的靈活性和製成密鑰後在程序中插入檢查的方便性,極大地增加了解密的難度。從使用的角度來看PAL、PEEL、GAL 等邏輯器件只能讀取數據,不能隨時寫入數據,密碼的重新設置比較麻煩;而EEPROM晶元可隨意讀寫,用在軟體狗上靈活性相當大,譬如可以為每一個軟體狗單獨設一個密碼,以增加解密的難度;另外,從EEPROM器件的電器性能上來說也非常適合做軟體狗;因此這種器件在軟體狗的設計中獲得了廣泛的應用,是當時軟體狗製作者的首選晶元。它象一般RAM存儲器一樣可讀寫(只不過讀寫是串列的),即使斷電後也能保存數據不變。常用的EEPROM型號是93C46,它是64×16bit的結構,也就是說一個93C46具有64個16位bit單元的容量,每次處理數據也都是16位。有的93C46,如 Microchip、ATMEL、CSi等品牌的93C46可以通過切換,變為128×8bit或64×16bit兩種模式,這對軟體狗製作來說就更靈活了,其加密效果也更好。當然也有人採用更大容量的93C56、93C66或容量小一點的93C06、93C26等EEPROM晶元。因為軟體狗是插在微機的並行口上,所以檢查程序是通過並行口的I/O地址去讀寫EEPROM。具體的讀寫方式跟硬體線路以及EEPROM的時序有關,因此,一般的檢查程序針對某一種硬體線路;但是這些程序大同小異,大體上是差不多的。
第四代軟體夠在第三代軟體狗基礎上,加入一個單片機晶元,如PIC16C5X。此晶元中存有特定的演算法程序,可將讀出的密鑰數據進行加密變換,以對抗邏輯分析儀。可以說,軟體狗發展到第四代,已經非常成熟了。在此技術上,各軟體狗研製公司又加入自己的電路設計,形成了各自的產品特色。
平時常見的狗主要有「洋狗」(國外狗)和「土狗」(國產狗)。這里「洋狗」主要指美國的彩虹和以色列的HASP,「土狗」主要有金天地(現在與美國彩虹合資,叫彩虹天地)、深思、堅石。總的來說,「洋狗」在軟體介面、加殼、防跟蹤等「軟」方面做得沒有「土狗」好,但在硬體上絕對「無法」 pj(應當說pj難度非常大):而「土狗」在「軟」的方面做得絕對稱得上世界第一,許多技術,如噪音、自檢測、演算法可變、碼表變換等等,可以說都很先進,而在硬體上不及國外,只要稍有單片機功力的人,都可復制。

現在狗的技術發展很快,針對不同的應用場合有不同的類型,如:
強勁狗:自由定義演算法的高強度加密方案
微狗: 面向單片機環境的高強度加密方案
USB狗: USB介面的微狗全兼容產品
軟體狗:面向單機環境的低成本加密方案
網路狗:面向網路環境的加密方案
卡式狗:面向網路環境的加密方案

軟體狗採取了各種的加密技術,目前較先進的加密技術有以下幾種:
AS技術:API函數調用與SHELL外殼加密結合,即使外殼被破壞,加密程序依然不能正常運行。
反跟蹤:
a.數據交換隨機噪音技術:有效地對抗邏輯分析儀分析及各種調試工具的攻擊。
b.迷宮技術:在程序入口和出口之間包含大量判斷跳轉干擾,動態改變執行次序,提升狗的抗跟蹤能力。
抗共享:可從硬體對抗並口共享器,由開發商選擇是否共享狗。
口令: 可由軟體開發商設置32位口令,口令錯誤將不能對存儲區進行讀寫。
時間閘:某些狗內部設有時間閘,各種操作必須在規定的時間內完成。狗正常操作用時很短,但跟蹤時用時較長,超過規定時間狗將返回錯誤結果。
單片機:硬體內置單片機,固化的單片機軟體保證外部不可讀,從而保證狗不可仿製。
存儲器:提供20位元組掉電保持存儲器供開發商存放關鍵數據、配置參數等信息。

市場上常見幾種軟體狗的簡單介紹
彩虹天地:在中國應該算是老大了,從第一代到第四代的產品都有,但它的主要產品還是第三代的微狗(TD-MH),該代產品中有干擾晶元,能隨時產生無用的干擾信號,更加有效的對抗邏輯分析儀;雖然有第四代的強勁狗(CS-QA),但好象有不少問題,所以推出的USB介面的加密鎖還是兼容微狗的。彩虹天地的加密強度不高,最簡單的pj方法就是隨便買一個狗,然後復製成要解的狗。
深思洛克:也是一個比較有名的,至2001年初最主要的產品就是第四代的深思Ⅲ型加密狗,特點就是用戶可在狗中定義自己的演算法,這大大加強了其保護能力,但它的CPU功能還不夠強,演算法上有漏洞,而且只提供一種加密方式,所以也是可以擊破的,並且也能硬體復制原狗。此類狗加密的產品有Pkpm 結構計算軟體、分析家股票軟體、圓方cad軟體等等。
深思 Ⅲ 的n階黑箱模型法:
深思 Ⅲ 的n階黑箱模型法並不是簡單的記憶,而是通過深思 Ⅲ 獨特的完全可編程使得深思 Ⅲ 鎖對於輸入和輸出呈現高階黑箱控制模型的特徵。每次調用代碼運行時使用鎖內存儲作為運算變數和參數,改變鎖的狀態影響後續的調用。用戶自定義的代碼沒有任何的說明書和特徵,甚至兩次相同的調用會返回不同的有用的結果。這是深思 Ⅲ 獨特之處。
以上加密範例並不要求加密者尋找復雜並難以預料的函數關系加以移植。
如果是採用0階黑箱模型那麼輸入與輸出具有直接的對應關系 y=f(x1,x2),其中x1,x2為本次輸入,y為本次輸出。這時如果函數關系簡單就很容易被解密者破譯,比如用迭代法、插值法和列表法等方法逼近;這就迫使加密者尋求復雜函數來防止解密者的破譯和模擬。但由於鎖內資源的限制使得軟體移植幾乎不可能。現在採用n階黑箱模型,就使得輸入與輸出的對應關系復雜化: yn=f(yn-1,yn-2,yn-3,...,y1,xn1,xn2),其中,y1,y2,...,yn-1為以前n-1次調用輸出或隱藏的結果, xn1,xn2為本次(第n次)調用的輸入參數。
面對這樣的復雜關系,解密者簡單地取消中間的任何一次調用都可能使後邊的結果發生錯誤,既使是簡單的函數關系也可以被這高階黑箱過程隱藏得難以推測。這樣,藉助於高階黑箱模型法很容易找到應用軟體中可以利用的公式或函數作為加密的對象。
n階黑箱模型法使用過程中一樣可以使用碼表法,例如,範例中的第一次調用。
但是,這樣的碼表法不同的加密點互相關聯,必須進行整體解密,這就大大地提高了加密強度。使用傳統的0階黑箱模型時,不同的加密點之間互不關聯只需各個擊破分別解密即可,其復雜度無法與n階黑箱模型相比。對於比較復雜的函數,盡管鎖內沒有足夠的資源,還是可以通過n階模型法進行加密處理我們可以將復雜函數化為簡單函數的運算組合,例如:y=(a-b)*(a+b)+c可以先計算(a-b)和(a+b)然後將結果相乘再加c。
n階模型嚴格說是不可解的(只是目前理論上,也請深思公司記住這一點),因為第n次輸出依賴於前n-1次輸入和輸出,而前n-1次輸出可能已部分或全部被隱藏,所以第n次輸出無法推測,至少推測n-1次輸入產生的輸出要比一次輸入產生的輸出復雜度有質的飛躍。
深思 Ⅲ 具有完備的指令系統,可以通過編程實現n階或任意階黑箱模型,每次調用互相關聯,並且可以絕對隱藏中間結果,只要使用得當,理論上是不可解的( 我的理論是沒有不可解的:)
飛天誠信:是新崛起的一家,主要產品是ROCKEY-IV和相兼容的USB狗,技術支持比較好,功能比較多,它的外殼加密程序很不錯,用在加密上主要是8號功能(種子碼)和14、15、16號功能(都是自定義演算法),它的自定義演算法比深思的產品好,「沒有」漏洞(目前理論上說)。如果很好地使用它加密,是極難pj的。但大多數開發商都很偷懶,比如就只用8號功能(種子碼)來加密。
製作和出售軟體狗的公司很多,你只要注意一下計算機雜志上的廣告就能得知。各公司生產的軟體狗除了上述特點外,一般都有一些為吸引用戶而附加的功能,主要是一些工具軟體,其核心技術卻是大同小異。

加密狗的一般特點
1、不佔用並行口,因為它雖然插在並行口上,但是它又提供了一個跟原來一致的並行口。
2、軟體具有防解密功能,可對抗各種調試工具的跟蹤。
3、一狗一密碼或一種線路,軟硬體不可互換,就像一把鎖一把鑰匙那樣。
4、提供各種語言的編程介面以及一套實用工具,方便用戶在自己開發的程序中嵌入加密模塊。
5、提供對可執行文件的加密工具,以便用戶對已有的產品進行加密。

目前主流軟體加密鎖的不足
對軟體加密保護產品而言,使用者最關心的是加密的有效性,產品的兼容性和穩定性。目前市場上主要的軟體加密鎖硬體內部均含有單片機,即所謂內置CPU,軟體廠商主要是利用演算法功能進行加密。加密鎖通常還增加了一些輔助功能,比如倒計數器、遠程升級等。這類型加密鎖主要產品有彩虹天地的「微狗」 「SuperPro」、深思洛克的「深思Ⅰ、III型」、 ALADDIN的HASP3、4等。通過對這些軟體鎖進行分析,認為從安全性上講他們至少有三方面致命的薄弱點:
薄弱點1:設計原理有很大缺陷
目前主流的加密鎖硬體提供了讀、寫和演算法變換功能,且演算法變換關系難以pj和窮舉。但這類加密鎖最大的缺陷是演算法不向軟體廠商公開,鎖內的變換演算法在出廠時已經固定,軟體加密者只能設置演算法的參數。這樣就限制了廠商對演算法的使用,要麼預先記錄演算法結果然後在軟體運行時核對(使用碼表),要麼在軟體中至少變換兩次然後比較結果是否一致;如果解密者截獲這些數據,通過統計、分析就有可達到解密目的。
薄弱點2:加密鎖受處理能力的限制,無法為軟體提供強有力的保護
市場上曾先後推出了幾款「可編程」加密鎖。這類型加密鎖最大的特點就是可以讓用戶自行設計專用演算法。「可編程」加密鎖的出現的確是軟體加密技術的一次進步。深思洛克的「深思III」、飛天誠信的「Rockey4」均屬此類產品。
但由於成本限制,這類型加密鎖往往只能採用10~20元人民幣的通用8位單片機或同檔次的ASIC晶元作為核心微處理器。這種低檔單片機的處理運算能力是相當弱的,這就給 「可編程」加密鎖造成了很大的局限性,主要表現在:1、演算法變換的復雜度不夠高,2、指令編碼空間較小,3、程序區的空間較小。這些局限性使得用戶根本不可能利用「可編程」加密鎖實現理想的高強度加密方案。
薄弱點3:硬體本身抵抗惡意攻擊的能力較弱
隨著集成電路設計、生產技術的發展,安全產品的核心晶元硬體本身受到攻擊的可能性越來越大。典型的硬體攻擊手段有電子探測攻擊(如SPA和DPA)和物理攻擊(探測,如採用SiShell技術),下面我們就這方面進行簡要的分析。
電子探測(SPA和DPA)攻擊技術的原理是:單片機晶元是一個活動的電子元器件,當它執行不同的指令時,對應的電功率消耗也相應的變化。通過使用特殊的電子測量儀和數學統計技術,來檢測和分析這些變化,從中得到單片機中的特定關鍵信息。
物理攻擊的方法有:通過掃描電子顯微鏡對晶元內部存儲器或其它邏輯直接進行分析讀取;通過測試探頭讀取存儲器內容;通過從外部無法獲取的介面(例如廠家測試點)對存儲器或處理器進行直接數據存取;再激活單片機的測試功能等。
由於通用低檔單片機並非定位於製作安全類產品,沒有提供有針對性的防範物理攻擊手段,因此比較容易通過電子探測(SPA和DPA)攻擊直接讀出存儲器內的數據。雖然大多數普通單片機都具有熔絲燒斷保護單片機內代碼的功能,但此類晶元應用場合廣、發行批量大,隨著廠商間委託加工與頻繁技術轉讓,使得利用該類晶元下載程序的設計漏洞,利用廠商的晶元測試介面,通過特殊的燒寫時序和數據讀出信息成為比較容易的事情。
ASIC晶元是完全根據用戶需求而特別定做,屬於小批量生產。由於其採用特殊的邏輯電路且不會輕易公開測試功能介面,因此只要以其為基礎開發的系統不是保存重要的信息或者不用於高級別的安全場合還是可以防範一般情況下的物理攻擊。
加密鎖性能判定
加密鎖很小巧,包含的技術內容卻很豐富。一般我們從三個方面分析加密鎖的性能:
第一個是加密原理,或者說加密鎖有些什麼功能,這往往是針對一些解密方法發展起來的,最需要創造性的地方就是這里。國內產品在這個方面一直與國外產品具備足夠的競爭能力。
第二個是加密鎖的可靠性、穩定性、兼容性、透明性等。這些是對鎖的基本要求,但是做完整並不容易,尤其是兼容性、透明性問題,加密廠家在這方面有著豐富的經驗,但是沒有誰可以100%保證。透明性是鎖的一個比較特殊的指標,由於鎖是工作在並口(列印口),並口還會有其他設備,比如列印機、繪圖儀、硬碟、光碟機等,鎖如果影響到原來設備的正常工作就是透明性不夠好,完全的透明是難以做到的,一般的加密廠家不保證鎖對並口硬碟、光碟機等設備的透明性。
最後一個是鎖的易學性、易用性。

軟體狗加解密技術的簡單介紹(我將在以後陸續加入並詳細介紹)
涉及到加、解密的技術可以說是包羅萬象,基本的有匯編語言、調試工具、操作系統等,還需要一些密碼學的基本常識,如果對數據結構、編譯原理等有一定的了解會更有幫助。當然,這並不是說沒有這些基礎就做不好加密,在使用加密鎖時,很多工作已經由加密廠家完成了,其實加密者只要對「隨機性」有一些基本的認識,就可以完成很出色的加密。這個隨機與一般意義上的隨機有所不同,這里強調的是「不可預測性」。如果解密者可以預知加密鎖返回的數據,就可以用程序代替鎖來返回,軟體就無法知道鎖是否真正存在,就是被解密了。這就是我們常說的「模擬」,在密碼學中就是假冒攻擊。所以,加密的一個重要思路就是讓解密者看來:鎖輸入輸出數據有很強的隨機性。目前,加密設計中最迫切解決的就是構造隨機性的問題。
常有人這樣加密:在軟體中反復檢查鎖內的數據,而且運用了很復雜的檢查方法,比如中間插入一些運算或者垃圾程序等,加密的工作量很大,以為「我查了那麼多次鎖還不夠嗎?」。但這在解密者眼裡不值一提,只要發現鎖返回數據的規律性就足夠解密了,根本不必理會軟體是怎麼使用的。這種加密失敗在於,只是用了些讀操作,沒有構成返回數據的隨機性。那麼,如果擴大加密鎖存儲容量,或者進行些寫操作就行嗎?顯然還是隨機性太差。因為這點,第一代加密鎖很難勝任真正的加密工作了。也因為這點,過去比較繁榮軟加密技術難以深入發展。這提醒我們,如果加密原理不合理,再大的加密工作量也是徒勞無益的。
使用演算法變換就可以增強隨機性,但是有人這樣加密:在軟體中大量調用演算法變換,變換的數據量也很大(即演算法碼表很大),可還是被輕易解密了。為什麼呢?是不是演算法被破了?不是。這種加密方法在解密者看來和上個沒有什麼不同,只要把每次變換的數據內容都記錄下來,如果軟體再用同樣的數據調用演算法,解密者自然知道應該返回什麼數據了。失敗原因是,碼表內容是固定的,被解密者窮舉了,沒有構成隨機性,這說明可以窮舉的東西是不具備隨機性的。那麼怎麼才能防止被窮舉呢?由於加密者也不知道演算法方程,實際上是做不到的。但是,我們可以給解密者增加很多窮舉困難。我們知道,只要讓解密者抓到一次,這個數據就再也沒有加密作用了,因此不能讓軟體運行一次就用完所有碼表,另外還可以用些隨機數來做變換,這就考驗解密者的分辨能力了。這是個技巧性比較高的問題,需要不小的工作量,但這的確對加密強度有貢獻。
如果加密者知道演算法內容,而解密者不知道,這樣就可以用任何數據來訪問加密鎖的演算法功能,解密者就無法窮舉了,第三代「可編程」加密鎖就能實現這種思想。
由於第三代鎖的出現,需要補充另外一個話題,就是加密鎖的功能。如果解密者可以通過數學方法解析出鎖的內部功能,就可以「模擬」了。如何設計鎖的功能才不易被破呢?這涉及到一點密碼學,一般的加密者只要能夠將不同類型的運算混合使用就夠。對於第一、二代加密鎖,解密者沒有必要去分析程序是如何使用鎖返回數據的(模擬的思路),而對於第三代鎖,這種方法常成了解密者唯一希望,寄希望於通過跟蹤鎖返回數據的使用過程而推測出鎖的內部功能。這時候幾乎任何能夠降低程序可讀性的手段都會提高加密效果,比如程序垃圾、反復的數據搬動、嵌入匯編、插入浮點運算等等。這點很吸引人,即使你剛明白加密,也能讓解密專家圍著你團團轉。
加密者往往遠不如解密者專業,隨著互聯網的發展,解密技術正以更快的速度傳播,這給加密帶來了更大的挑戰。

軟體狗的加密技術介紹
解密一個軟體狗可以從兩方面入手,其一是軟體,只要把檢查軟體狗的那部分代碼解除,那麼軟體狗就成了一隻「死狗」。其二是從硬體入手的解密方法,其含義是要仿製一個加密盒,不管機密做的如何好,如果加密盒被仿製了,那麼軟體狗的加密作用也就不存在了。因此,從硬體入手的解密跟從軟體入手的解密其效果是一樣的,只不過後者需要付出一定的額外代價—硬體成本而已。
那麼既然從軟體、硬體著手都能解密,用它來保護軟體還有什麼作用?不用著急,讓我們來談談如何更地保護您的軟體。
針對解密的兩種方法,我們也從這兩方面來加強軟體的加密功能。

增強軟體狗加密功能的方法
一、軟體加密
全面我們說,從軟體入手的解密方法很多,針對這種情況,人們也研製出了很多行之有效的防解密措施,在次,我們把一些常用的防止軟體跟蹤解密的措施列於下面:
1、計算程序執行時間,並判斷程序的執行時間是否過長;
2、關鍵程序部分禁止 鍵盤中斷,並檢查鍵盤中斷是否被開放;
3、關鍵程序部分禁止顯示輸出和列印輸出;
4、在軟體中多做幾次軟體狗檢查;
5、把程序的重要部分加以編碼加密,在運行時才解密;
6、修改斷點中斷功能;
7、利用除零中斷或溢出中斷是否有程序跟蹤;
8、利用時鍾中斷檢查是否有程序跟蹤;
9、在程序中調用INT 7;
10、程序不要寫得很結構化,要多一些「廢話」;
11、若干種加密方法綜合使用;
12、用黃玫瑰軟體製作組出品的BITSHELL作外層防護;
...... ......
==================================================
[ 附:外殼反跟蹤反破譯程序BITSHELL簡介
一、系統簡介
BITSHELL是一套可反跟蹤反破譯的軟體加密系統,主要用語保護軟體開發者的合法權益,防止未經授權的復制、演算法解讀及目標碼反匯編。它是我們應高級開發者的要求從BITLOK中提煉出來的,專為應用軟體提供pj保護的系統。應用軟體開發者可以充分發揮自己的才智編寫或精巧或復雜的程序,有 BITSHELL的保護不用擔心競爭者對商品軟體進行逆向分析。應用軟體開發者更可以設計自己的反拷貝介質(加密卡、加密狗等),然後用BITSHELL 進行外層保護,從而不必擔心訪問反拷貝介質的代碼被截獲。應用軟體開發者也可以購買商品化的加密卡,加密狗等,在應用系統內部秘密地存取加密卡、加密狗,用BITSHELL作外層保護,防止訪問反拷貝介質的代碼被截獲。
主要功能和性能如下:
千變萬化的加密方案
內含隨機可選的二十套加密演算法,構造出千變萬化的反跟蹤反破譯方案,特別適合加密有多個單獨執行程序的軟體。
先進超強的反跟蹤技術
採用加密虛擬機、多層間址多 鏈解等獨創的世界領先技術,結合傳統的加密方法,具備超強的動態反跟蹤能力。防範各種軟硬體調試器對其破譯。不僅防止了國際上通用的調試器,如:Soft-ICE,Turbo Debugger,Symdeb等,還重點防範了國內開發的各種專用調試器。
可靠性高、兼容性好、使用面最廣泛
經BITSHELL1.0加密過的軟體日夜運行在超過60萬台機器上,經過了最廣泛、最嚴格的測試。BITSHELL2.0具備同樣可靠的性能,加密過的軟體可以在各種廠牌各種機型上正常運行,兼容各種流行的DOS系統。
功能全面、使用方便
可加密各種帶覆蓋模塊的執行文件,特別適合加密有Clipper,FoxPro等編譯的各種資料庫應用系統。
提供OBJ嵌入式加密模塊。這樣,用戶還可以在源程序里加入加密模塊,與外殼部分相互關聯,有效地提高破譯難度。
可以為用戶定製專用BITSHELL反跟蹤反破譯系統,可以滿足用戶的獨特需求。
二、快速入門
BITSHELL經過了用戶嚴格的檢驗,作者對其精雕細琢反復修正,現在的版本使用極容易。確保BITSHELL硬碟或網路安裝已經成功,或BITSHELL源盤在軟碟機中,加密方法如下:
BITSHELL<源文件><目標文件>
例如:
把TEST.EXE加密成TESTOK.EXE。輸入以下命令
BITSHELL TEST.EXE TESTOK.EXE
把TEXE.EXE加密不保留未加密的程序。輸入以下命令。
三、操作指南
1、BITSHELL參數的詳細說明
BITSHELL可以用KEY環境變數來設定一些參數,這樣可以簡化使用過程。設置方法如下:
SET KEY=[SCHEMExx,][STAY,][CHECKOVL]
BITSHELL各項參數的意義如下:
(1)參數SCHEMExx,若給出則依用戶的要求使用指定的變形演算法,否則將隨機抽取一種加密演算法。BITSHELL2.0共有20種演算法可選。
每一種演算法都有自己

C. 急求!!「1024位的RSA 公開密鑰加密演算法 」數據結構課程設計!高手解答啊!!

[我是不是復制粘貼的,我認真寫的,你也認真看下就懂了]
我寫的這個淺顯易懂,看看你就明白了。舉得有例子。

RSA演算法舉例說明
http://hi..com/lsgo/blog/item/5fd0da24d495666834a80fb8.html

空間裡面好像還有演算法

知道裡面剛才回答了另個朋友的問題帖出來給你看看
http://..com/question/91261774.html?si=2
題目:用RSA演算法加密時,已經公鑰是(e=7,n=20),私鑰是(e=3,n=20),用公鑰對消息M=3加密,得到的密文是_____?
給出詳細過程。 謝謝!
答:
你所說的:
n=20
d=7 公鑰
e=3 私鑰
對M=3 進行加密
M'=M^d%n (M的d次方,然後除以n取余數)
M'=3^7%20=2187%20=7 加密後等於7

對M'=7進行解密
M=M'^e%n=7^3%20=343%20=3 解密後又變成3了

你取的兩個素數太小了,所以n太小根本起不了作用。至少要取1024位的數字

D. 做路基路面的課程設計,下了HPDS2011的破解版,但是我怎麼安裝都提示我未設置或設置錯誤加密狗,誰能幫我

以下安裝步驟為摸索嘗試了多遍成功安裝後總結,親測可用!
1、右鍵管理員許可權運行安裝主程序;
2、將「破解補丁文件」(sense3.dat、sense3.dll,可能報毒,建議將殺毒軟體及衛士關閉或將文件加入白名單)按要求復制到安裝目錄里,替換原文件;
3、如果是64位系統,安裝完成後用管理員許可權打開cmd,輸入regsvr32 MSCOMCTL.OCX命令並回車,提示載入成功後(如果提示不成功則缺少相應文件,進行步驟4操作)再運行程序;
4、將「可能缺少的文件」里的三個文件(MSCOMCTL.OCX、COMCTL32.OCX、TABCTL32.OCX,文件可以在網上下載)復制到C:\Windows\SysWOW64目錄下,然後管理員許可權運行步驟3中的cmd相關命令,提示載入成功後再運行主程序;
5、如果電腦系統是32位則理論上替換「破解補丁文件」後應該可以直接運行,如果不能運行,則將「可能缺少的文件」復制到C:\Windows\System32目錄下,然後管理員許可權運行cmd,輸入regsvr32 MSCOMCTL.OCX命令並回車,提示載入成功後再運行主程序。

E. c語言課程設計 文本文件加密技術

以前寫過一個差不多的,不知道你們能不能用得上,初始密碼123

#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
#include"string.h"

voidmenu();//菜單
voidchuLi();//處理
voidQu();//讀取
voidopenPassword();//打開密碼
charpassword[]="123";//密碼
enums{JIAMI,JIEMI,DUQU}state;//處理狀態(加密,解密,讀取)

//加密演算法
voidcalculate(char*c)
{
switch(state)
{
caseJIAMI:
*c=*c^'0';
*c=*c+100;
break;
caseJIEMI:
caseDUQU:
*c=*c-100;
*c=*c^'0';
break;
}
}

intmain()
{
openPassword();
for(;;)
menu();
}

//打開密碼
voidopenPassword()
{
charinput[50];

printf("請輸入密碼:");
scanf("%s",input);

//判斷密碼是否正確
while(strcmp(input,password)!=0)
{
printf("密碼錯誤,請重新輸入:");
scanf("%s",input);
}
}

//菜單
voidmenu()
{
intselect;
system("cls");
printf("1.加密文本 ");
printf("2.解密文本 ");
printf("3.讀取文本 ");
printf("請選擇:");
scanf("%d",&select);
system("cls");

//判斷輸入是否正確
while(select<1||select>3)
{
printf("輸入有誤,請重新輸入:");
scanf("%d",&select);
}

switch(select)
{
case1:
state=JIAMI;
chuLi();
break;
case2:
state=JIEMI;
chuLi();
break;
case3:
state=DUQU;
Qu();
break;
}
}

//處理
voidchuLi()
{
FILE*file;//源文件
FILE*fileL;//臨時文件
charfileName[50];//文件名
charcommand[50];//命令語句
charc;//臨時處理變數

//打開源文件
do
{
if(state==JIAMI)
printf("請輸入要加密的文件:");
elseif(state==JIEMI)
printf("請輸入要解密的文件:");
scanf("%s",fileName);
file=fopen(fileName,"r");
if(file==NULL)
printf("文件不存在,");
}while(file==NULL);

//進行加解密
fileL=fopen("臨時文件.txt","w");
while(!feof(file))
{
c=fgetc(file);
calculate(&c);
fputc(c,fileL);
}
fclose(file);
fclose(fileL);

//刪除源文件
sprintf(command,"del%s",fileName);
system(command);

//重命名新文件
sprintf(command,"rename臨時文件.txt%s",fileName);
system(command);

if(state==JIAMI)
printf("加密成功");
elseif(state==JIEMI)
printf("解密成功");
getch();
}

//讀取
voidQu()
{
FILE*file;
charfileName[50];
charc;

//打開源文件
do
{
printf("請輸入要讀取的加密文件:");
scanf("%s",fileName);
file=fopen(fileName,"r");
if(file==NULL)
printf("文件名不存在,");
}while(file==NULL);

//把文件輸出到屏幕上
system("cls");
while(!feof(file))
{
c=fgetc(file);
calculate(&c);
printf("%c",c);
}
fclose(file);
getch();
}
閱讀全文

與課程設計文件加密解密相關的資料

熱點內容
怎麼把微信抖音加密 瀏覽:302
android滑動進度條 瀏覽:834
javagmt轉換 瀏覽:826
linux查看snmp 瀏覽:24
ug80車床編程 瀏覽:516
怎麼加速python計算素數 瀏覽:241
腰椎第五節壓縮性骨折 瀏覽:91
程序員開會的句子 瀏覽:993
用哪個app寫編程 瀏覽:645
android通訊錄增刪改查 瀏覽:731
車貸解壓過戶可以同時進行嗎 瀏覽:921
java面向對象編程題目 瀏覽:884
二次元壓縮包 瀏覽:701
stc模擬器編程器 瀏覽:156
伺服器銷售怎麼做好 瀏覽:89
什麼是com編程 瀏覽:850
演算法工程師最新資訊 瀏覽:613
郵政銀行卡怎麼在app簽約綁定 瀏覽:51
壓縮卷一直轉 瀏覽:978
初一編程小程序怎麼做 瀏覽:828