導航:首頁 > 文檔加密 > paillier加密演算法C語言

paillier加密演算法C語言

發布時間:2022-07-03 10:46:33

1. 用c語言設計一個簡單地加密算,解密演算法,並說明其中的原理

恰巧這兩天剛看的一種思路,很簡單的加密解密演算法,我說一下吧。
演算法原理很簡單,假設你的原密碼是A,用A與數B按位異或後得到C,C就是加密後的密碼,用C再與數B按位異或後能得回A。即(A異或B)異或B=A。用C實現很簡單的。
這就相當於,你用原密碼A和特定數字B產生加密密碼C,別人拿到這個加密的密碼C,如果不知道特定的數字B,他是無法解密得到原密碼A的。
對於密碼是數字的情況可以用下面的代碼:
#include <stdio.h>
#define BIRTHDAY 19880314
int main()
{
long a, b;

scanf("%ld", &a);
printf("原密碼:%ld\n", a);
b = BIRTHDAY;
a ^= b;
printf("加密密碼:%ld\n", a);

a ^= b; printf("解密密碼:%ld\n", a);
return 0;
}
如果密碼是字元串的話,最簡單的加密演算法就是對每個字元重新映射,只要加密解密雙方共同遵守同一個映射規則就行啦。

2. C語言編程:編寫一個函數實現籬笆加密

intfence_cipher(unsignedchar*data,intdata_length,intn)
{
unsignedchar*ret;
inti,j,k=0;

if(data_length<=0||strlen((constchar*)data)==0){
return2;
}

if(n<=1||n>=data_length){
return1;
}

ret=(unsignedchar*)calloc(1,data_length+1);
if(ret==NULL){
return3;
}

for(i=0;i<n;i++)
{
for(j=0;j*(n+1)<data_length;j++)
{
if(j*(n+1)-i>=0){
ret[k++]=data[j*(n+1)-i];
}

if(i!=0&&i!=n-1&&j*(n+1)+i<data_length){
ret[k++]=data[j*(n+1)+i];
}

}
}

ret[k]='';

strncpy((char*)data,(char*)ret,data_length);
free(ret);
return0;

}

3. C語言加密演算法

#include<stdio.h>

intconstN=10;

//將方陣a[N][N]第row行循環左移m位
voidRowLeftn(chara[][N],intn,introw,intm){
inti,j,t;
if(row<0||row>n-1)return;
for(i=0;i<m;++i){
t=a[row][0];
for(j=0;j<n-1;++j)
a[row][j]=a[row][j+1];
a[row][n-1]=t;
}
}

//將方陣a[N][N]第col列循環上移m位
voidColUpn(chara[][N],intn,intcol,intm){
inti,j,t;
if(col<0||col>n-1)return;
for(i=0;i<m;++i){
t=a[0][col];
for(j=0;j<n-1;++j)
a[j][col]=a[j+1][col];
a[n-1][col]=t;
}
}

intmain(){
chartxt[N][N];
inta[N],b[N],i,j,n;
while(scanf("%d",&n)==1&&n>0){
fflush(stdin);
for(i=0;i<n;++i){
for(j=0;j<n;++j)
scanf("%c",&txt[i][j]);
}
for(i=0;i<n;++i){
for(j=0;j<n;++j)
printf("%c",txt[i][j]);
printf(" ");
}
for(i=0;i<n;++i)scanf("%d",&a[i]);
for(i=0;i<n;++i)scanf("%d",&b[i]);
for(i=0;i<n;++i)RowLeftn(txt,n,i,a[i]);
for(i=0;i<n;++i)ColUpn(txt,n,i,b[i]);
for(i=0;i<n;++i){
for(j=0;j<n;++j)
printf("%c",txt[i][j]);
}
printf(" ");
}
return0;
}

4. C語言 加密演算法

#include<stdio.h>

#include<string.h>

#defineMAX_LEN1024

#defineMAX_KEY_LEN10

/*key必須是1-9之間的數字*/

/*擁有K個字元的Key,包含且僅包含1-K*/

intCheckKey(char*key)

{

inti,check[MAX_KEY_LEN]={0};

intmax=strlen(key);

intkeyVal;

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

{

keyVal=key[i]-'0';

if(keyVal>max||keyVal<1)

return0;

if(check[keyVal]==1)

return0;

else

check[keyVal]=1;

}

return1;

}

intEncrypt(char*word,char*key,char*secretWord)

{

inti,start;

intnLenWord=strlen(word);

intnLenKey=strlen(key);

intindex[MAX_KEY_LEN];

if(nLenWord%nLenKey!=0)

{

printf("明文的位數不是密鑰位數的整數倍! ");

return0;

}

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

{

index[i]=key[i]-'0'-1;

}

/*START關鍵代碼*/

start=0;

while(start<nLenWord)

{

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

{

secretWord[start+i]=word[start+index[i]];

}

start+=nLenKey;

}

secretWord[nLenWord]='';

/*END關鍵代碼*/

return1;

}

intmain()

{

charword[MAX_LEN];

charkey[MAX_KEY_LEN];

charsecretWord[MAX_LEN];

printf("請輸入明文:");

scanf("%1024s",word);

printf("請輸入密鑰:");

scanf("%10s",key);

if(!CheckKey(key))

{

printf("密鑰輸入錯誤! ");

exit(-1);

}

if(Encrypt(word,key,secretWord))

printf("密文是:%s ",secretWord);

return0;

}

5. c語言加密解密演算法

這里使用的是按位加密,按ASCII碼進行加密的演算法自己寫個,很容易的。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

void dofile(char *in_fname,char *pwd,char *out_fname);/*對文件進行加密的具體函數*/
void usage(char *name);

void main(int argc,char *argv[])/*定義main()函數的命令行參數*/
{
char in_fname[30];/*用戶輸入的要加密的文件名*/
char out_fname[30];
char pwd[10];/*用來保存密碼*/

if(argc!=4)
{/*容錯處理*/
usage(argv[0]);
printf("\nIn-fname:\n");
gets(in_fname);/*得到要加密的文件名*/
while(*in_fname==NULL)
{
printf("\nIn-fname:\n");
gets(in_fname);
}

printf("Password 6-8:\n");
gets(pwd);/*得到密碼*/
while(*pwd==NULL || strlen(pwd)>8 || strlen(pwd)<6)
{
printf("Password 6-8:\n");
gets(pwd);
}

printf("Out-file:\n");
gets(out_fname);/*得到加密後你要的文件名*/
while(*in_fname==NULL)
{
printf("Out-file:\n");
gets(out_fname);
}
while(!strcmp(in_fname,out_fname))
{
printf("文件名不能和源文件相同\n");
printf("Out-file:\n");
gets(out_fname);
}
dofile(in_fname,pwd,out_fname);
printf("加密成功,解密請再次運行程序\n");

}
else
{/*如果命令行參數正確,便直接運行程序*/

strcpy(in_fname,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out_fname,argv[3]);
while(*pwd==NULL || strlen(pwd)>8 || strlen(pwd)<6)
{
printf("Password faied!\n");
printf("Password 6-8:\n");
gets(pwd);
}

while(!strcmp(in_fname,out_fname))
{
printf("文件名不能和源文件相同\n");
printf("Out-file:\n");
gets(out_fname);
while(*in_fname==NULL)
{
printf("Out-file:\n");
gets(out_fname);
}
}

dofile(in_fname,pwd,out_fname);
printf("加密成功,解密請再次運行程序\n");

}

}

/*加密子函數開始*/
void dofile(char *in_fname,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=strlen(pwd);

fp1=fopen(in_fname,"rb");
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);/*如果不能打開要加密的文件,便退出程序*/
}
fp2=fopen(out_file,"wb");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立加密後的文件,便退出*/
}

/*加密演算法開始*/
while(j0>=0)
{
ch=fgetc(fp1);
while(!feof(fp1))
{
fputc(ch^pwd[j>=j0?j=0:j++],fp2);/*異或後寫入fp2文件*/
ch=fgetc(fp1);
}
j0--;
}
fclose(fp1);/*關閉源文件*/
fclose(fp2);/*關閉目標文件*/
}

void usage(char *name)
{
printf("\t=======================File encryption======================\n");
printf("\tusage: %s In-fname password out_fname\n",name);
printf("\tExample: %s file1.txt 12345678 file2.txt\n",name);
}

6. c語言實現密碼加密

unsignedchar*encrypt(unsignedchar*psw,intenc){
intsum=0,i;
if(enc){
for(i=0;i<6;i++){
psw[i]-=15;
sum+=psw[i];
}
psw[6]=(unsignedchar)sum;
psw[7]=0;
}
else{
for(i=0;i<6;i++){
sum+=psw[i];
psw[i]+=15;
}
if((unsignedchar)sum!=psw[6]){
printf("Badpassword ");
psw[0]=0;
returnpsw;
}
else{
psw[6]=0;
}
}
for(i=0;i<3;i++){
unsignedchart=psw[i];
psw[i]=psw[5-i];
psw[5-i]=t;
}
returnpsw;
}

intmain()
{
unsignedcharpsw[128];
scanf("%s",psw);
printf("encodeto:%s ",encrypt(psw,1));
printf("decodeto:%s ",encrypt(psw,0));
return0;
}

7. c語言加密演算法

看你催就倉促寫了個,自我感覺寫的不是很好,但是能用了。數據只能是大寫字母組成的字元串。
加密的時候,輸入Y,然後輸入要加密的文本(大寫字母)
解密的時候,輸入N,然後輸入一個整數n表示密文的個數,然後n個整數表示加密時候得到的密文。
/*RSA algorithm */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MM 7081
#define KK 1789
#define PHIM 6912
#define PP 85
typedef char strtype[10000];
int len;
long nume[10000];
int change[126];
char antichange[37];

void initialize()
{ int i;
char c;
for (i = 11, c = 'A'; c <= 'Z'; c ++, i ++)
{ change[c] = i;
antichange[i] = c;
}
}
void changetonum(strtype str)
{ int l = strlen(str), i;
len = 0;
memset(nume, 0, sizeof(nume));
for (i = 0; i < l; i ++)
{ nume[len] = nume[len] * 100 + change[str[i]];
if (i % 2 == 1) len ++;
}
if (i % 2 != 0) len ++;
}
long binamod(long numb, long k)
{ if (k == 0) return 1;
long curr = binamod (numb, k / 2);
if (k % 2 == 0)
return curr * curr % MM;
else return (curr * curr) % MM * numb % MM;
}
long encode(long numb)
{ return binamod(numb, KK);
}
long decode(long numb)
{ return binamod(numb, PP);
}
main()
{ strtype str;
int i, a1, a2;
long curr;
initialize();
puts("Input 'Y' if encoding, otherwise input 'N':");
gets(str);
if (str[0] == 'Y')
{ gets(str);
changetonum(str);
printf("encoded: ");
for (i = 0; i < len; i ++)
{ if (i) putchar('-');
printf(" %ld ", encode(nume[i]));
}
putchar('\n');
}
else
{ scanf("%d", &len);
for (i = 0; i < len; i ++)
{ scanf("%ld", &curr);
curr = decode(curr);
a1 = curr / 100;
a2 = curr % 100;
printf("decoded: ");
if (a1 != 0) putchar(antichange[a1]);
if (a2 != 0) putchar(antichange[a2]);
}
putchar('\n');
}
putchar('\n');
system("PAUSE");
return 0;
}
測試:
輸入:
Y
FERMAT
輸出:
encoded: 5192 - 2604 - 4222
輸入
N
3 5192 2604 4222
輸出
decoded: FERMAT

8. 60分求簡單的RSA加密演算法,要求是C或者C++編寫的!

#include<iostream>
#include<cmath>
using namespace std;

void main()
{
int p,q;
cout<<"請輸入兩個較大的素數:"<<endl;
cin>>p>>q;
cout<<"p="<<p<<",q="<<q<<endl;
int n,o;
n=p*q;
o=(p-1)*(q-1);
cout<<"n="<<n<<",o="<<o<<endl;
cout<<"請從【0,"<<o-1<<"】中選擇一個與"<<o<<"互素的數e:"<<endl;
int e,i;
float d;
cin>>e;
for(i=1;;i++)
{
d=(float)(o*i+1)/e;
if(d-(int)d==0)
break;
}
cout<<"e="<<e<<",d="<<d<<endl;
cout<<"公開密鑰Pk={e,n}={"<<e<<","<<n<<"}"<<endl;
cout<<"秘密密鑰Sk={d,n}={"<<d<<","<<n<<"}"<<endl;
cout<<endl;

cout<<"請輸入要加密的正整數(以-1結束):"<<endl;
int m1[500],m3[500],m4[500];
double m2[500];
int j;
for(j=0;j<500;j++)
{
cin>>m1[j];
if(m1[j]==-1)
break;
m2[j]=pow(m1[j],e);
m4[j]=m2[j]/n;
m3[j]=m2[j]-m4[j]*n;
}
cout<<"密文為:"<<endl;
int k;
for(k=0;k<j;k++)
cout<<m3[k]<<" ";
cout<<endl;
}

看看行不?
各位大蝦指教

9. 急急急,常用加密演算法源代碼(C語言版)

忘差不多了,大概就這么做的,演算法自定!

#include <stdio.h>

#define N 8
void main()
{
int i,j,temp,count=0;
int number,num[N];
//輸入原始數據
printf ("請輸入一個小於8位的數:\n");
scanf ("%d",&number);
//數據倒序
while (number>0)
{
num[count] = number % 10;
number = number / 10;
count++;
}
printf ("\n");
//求得數字加5再除以10求余數得到新數據
for (i=0;i<count;i++)
{
num[i] = (num[i]+5)%10;
}
printf ("\n");
//第一個和最後一個互換位置
temp = num[0];
num[0] = num[count-1];
num[count-1] = temp;

10. C語言加密演算法(簡單)

MD5是HASH演算法,他不能用來解密的,他主要是用來校驗信息的完整型,也就是我們常說的數值簽名,你可以去RFC文檔上收索,上邊有他具體的演算法,代碼也是封裝好了的,可以去研究研究

閱讀全文

與paillier加密演算法C語言相關的資料

熱點內容
靜態路徑命令 瀏覽:531
一直編譯不過怎麼辦 瀏覽:827
汽車串聯並聯演算法 瀏覽:458
助眠解壓的聲音音頻小哥哥 瀏覽:275
pythoncmd換行 瀏覽:374
linux取消行號 瀏覽:353
安卓原生系統官網是什麼 瀏覽:444
底部主圖源碼 瀏覽:878
伺服器崩了有什麼提示 瀏覽:780
遠程海康伺服器用什麼瀏覽器 瀏覽:232
解壓報紙圖片 瀏覽:956
python微信公眾號開發平台 瀏覽:895
知識付費網站java源碼 瀏覽:255
方舟怎麼做命令管理 瀏覽:849
linux流量異常 瀏覽:675
單片機如何給電腦加密碼 瀏覽:519
如何刪掉多餘的伺服器 瀏覽:220
c編程演算法 瀏覽:833
堵車如何緩解壓力 瀏覽:17
喜鵲快貸app怎麼了 瀏覽:263