码迷,mamicode.com
首页 > 其他好文 > 详细

Vernam密码

时间:2016-03-19 12:35:31      阅读:2419      评论:0      收藏:0      [点我收藏+]

标签:

Vernam加密法也称一次一密(One-Time-Pad),用随机的非重复的字符集合作为输出密文.这里最重要的是,一旦使用了变换的输入密文,就不再在任何其他消息中使用这个输入密文(因此是一次性的).输入密文的长度等于原消息明文的长度

#include
char arr[26][26];
char message[22],key[22],emessage[22],retMessage[22];
int findRow(char);
int findColumn(char);
int findDecRow(char,int);
int main()
{
 int i=0,j,k,r,c;
 k=96;

 for(i=0;i<26;i++)
 {
   k++;
   for(j=0;j<26;j++)
   {
    arr[i][j]=k++;
    if(k==123)
    k=97;
   }
 }
 printf("\n输入明文\n");
 gets(message);
 printf("\n输入密钥\n");
 gets(key);
 // 加密
 for(i=0;key[i]!=NULL;i++)
 {
   c=findRow(key[i]);
   r=findColumn(message[i]);
   emessage[i]=arr[r][c];
 }
 emessage[i]=\0;
 printf("\n 密文为:\n\n");

 for(i=0;emessage[i]!=NULL;i++)
 printf("%c",emessage[i]);
 //解密
 for(i=0;key[i]!=NULL;i++)
 {
    c=findColumn(key[i]);
    r=findDecRow(emessage[i],c);
    retMessage[i]=arr[r][0];
  }
  retMessage[i]=\0;
  printf("\n\n解密后的明文为:\n\n");
  for(i=0;retMessage[i]!=NULL;i++)
  printf("%c",retMessage[i]);
 return(0);
}
int findRow(char c)
{
  int i;
  for(i=0;i<26;i++)
  {
   if(arr[0][i]==c)
   return(i);
  }
}
int findColumn(char c)
{
  int i;
  for(i=0;i<26;i++)
  {
   if(arr[i][0]==c)
   return(i);
  }
}
int findDecRow(char c,int j)
{
  int i;
  for(i=0;i<26;i++)
  {
   if(arr[i][j]==c)
   return(i);
  }
}

 

Vernam密码

标签:

原文地址:http://www.cnblogs.com/test404/p/5294655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!