LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1001|回复: 3

急求:关于RSA的C源码

[复制链接]
发表于 2007-7-14 16:36:36 | 显示全部楼层 |阅读模式
先粘贴一份简洁代码
[code]
*
RSA算法模拟。
1)选取两个大素数p,q
2)求出n=p*q,以及f(n)=(p-1)*(q-1)
3)随机选取整数d,使得d与f(n)互素
4)选取整数e,使得(e*d)%f(n)==1
5)公钥为n和e,私钥为n和d
加密算法:c=me mod n
解密算法:m=cd mod n
*/

#i nclude <math.h>

int IsPrime(long n)
{
  long i;
  for(i=2;i<n;i++)
    if(n%i==0)
      break;
  if(i<n)
    return 0;
  else
    return 1;
}

long NextPrime(long n)
{
  int i;
  while(IsPrime(n)==0)
    n++;
  return n;
}

long gcd(long m,long n)
{
  long r;
  while((r=m%n)!=0)
  {
     m=n;
     n=r;
  }
  return n;
}

long husu(long n)
{
   long i=n-1;
   while(gcd(n,i)!=1)
     i++;
   return i;
}

long modone(long m,long n)
{
  long i=n;
  while((i*m)%n!=1)
    i++;
  return i;
}

void rsacreate(long p,long q,long *n,long *e,long *d)
{
  *n=p*q;
  *d=husu((p-1)*(q-1));
  *e=modone(*d,(p-1)*(q-1));
}

long rsa(long m,long e,long n)
{
  long t=1;
  long i;
  for(i=1;i<=e;i++)
  {
      t*=m;
      t=t%n;
  }
  return t%n;
}

void main()
{
  long m,c,p,q,d,e,n,t;
  p=NextPrime(30);
  q=NextPrime(40);
  rsacreate(p,q,&n,&e,&d);
  clrscr();
  printf("\np=%ld,q=%ld\n",p,q);
  printf("\nThe opened key is:%ld&%ld\n",n,e);
  printf("\nThe private key is:%ld&%ld\n",n,d);
  printf("\nInput a number to encrypt:\n");
  scanf("%ld",&m);
  c=rsa(m,e,n);
  printf("\nThe encrypted number is:\n%ld",c);
  t=rsa(c,d,n);
  printf("\nThe restored number is:\n%ld",t);
  if(t==m)
    printf("OK,RIGHT");
  else
    printf("ERROR");
  }
[code]

现在直接知道了模N,加密密匙E和解密密匙D,要写一个第五步的加密解密的通用函数
给出几个值
d200= F040B040B97AF8CA944C096858C07775A2A3B054A7C507042184A49D1EF5A4FCE5FA76D95CFC96192055D8B8762107A2651BF3A30DF749FD09A564253BD3ACCC3C359643CEA8CFBEC639102A23434A6FD885FABDB79020F28D98716B3DADC323BE3CB341

d300= 3DF594ADB6FF7ABDF4795F682FF63EC616AF099356FE03FB763980BD6D4B26D6FA9D6ACF81E1C5C0CD78B1A75F2A47CA8C030197DB703D613E5B93726F0CFF81B6FA2198A7F27C58A93804083766BE046F0BDEDF626923CE4C8FEE52B45615F305180E7274E0A76640945662A4436576FAB1DB7132BCA76779E2CD166F423C7958C257C021BA76D33866CFA8F292429F03CFDE0069A3

d400= B0EB4F3511F947C23399B504FDB405E4D045C1A696266C093174924826531C9DE05463A432A371B345F7FA7F337DC5B656B0998A4ECF585292643C391AC64876F31488DD528A99E3F73300F32392696770467A4CE1665343DCE8C2C72C37A101ED9B3A5E4EF8D279CC8E445C9D7630155A29B5774A53C18CB870591BCBE71F1F6C688D6B19DFC1A7EC20F390F57372FF0F2D953B1FB7B97F52BFA1CC15DA96A8AD8481EDAE7D65759980E9741B9184AF8E4F23E5AC8E393231D7627804E9000C6263464F2E4C52C8

e200= F557D734874FB07DCE8B131709427875EAE29EFC2B2A758704EE4324C656801513CFE9E0B409715FC2D75B81BD8202A7087742589B341C5D9FDFA5B5366F77B231604FFA6764FD18D55DD848E87457CE3514492092E08E181AE95BB33D293A446D1BD761

e300= B548758E15EAFE878D3F447970E5BB95C2FEA97FBD920A009E2AAE350966FA6EE147632061F6A744D6FBD4D5E2E72E367ABB1DF9A9AE7CD9DB2B4CF1A3D1BFA205C15E720D13E33706227F00B4DB261DFBE29E21E5BD83E7EF97E67BAD4E092CE2B56581E913C4610FD227D9D6B2C13A53933B0881BE2E2CDC7DACA3F7AEE7DDA714883E351529B1D0FDEB60588AF27D74BFD49D7EA1

e400= 370A01254FB0AF3C66E091E6318196547B9F729B31897E35B7F1F5FF72AEA8BA6CBD6BDA738C75BAEABD2405661926DE92DB616A9C201C11A6CE94B0557A992A7560FEC204EFECF2539ADF68E83868349E05897B534F6CB789AA5DB596ED2B656522ABFD02C904F6A166A41EE8EF4A45704FCAC088F54D2942764EFC45C65E5B49E3707C6E3BCEC6D541A2F7350CDE21478825681A13DF46E15059874038321D03A46F2D26142940EE3BCA24FFB1F3B8F3C0B8430AC7123E644A8D55B910B89AA16488324D842597

n200= 350CE3C9A5B2BDC0820C3BCA10BEA6543B077E7C7467FF574F745203B5DDF3E73600527A68C226E17FA7B6D17176F78A418DE88D2A2A933444FEB59CFD74525913229D0CCDEE9598D97EFAAD3CB968FA1CC64B94DEB4F6E071F572A96A24C65C854EB4E7

n300= 1F185829C54B78CB8398852CCC540713326E165F07C6978952CC9F7DE5C88B2983B4DFFE0F657B034FCFD93BBF81711075ABA7618B0D7B62CA3BA1BF4F1B72C6F697C7A538F0FD7A2B7077FBA0B33A63F19444E6924F8101C4663E4BB5F98EE5D7D8A64E786E5B8C70B30CAB6D4AD88081C4C305C819EE732DF588AC7D7761406E1521E559DBCCE2014AD54934CE4D042635D2C0F794

n400= 950C19B7E654204A3A09456A80C22639F71B5BD24CF2A860C27BB88BBBBE5361220C3086D3FB1A990D49BFDD19A2759ECBA0A8F6620E2224FE5ED180D25DC31D23C8858CF6FF9DF6B560451BF8EE7C1A25A24A50EC771C71CF3006E58975E420FFBC560790D9C105B6EDADE222F73774CBD35BB3E57A5513918557D971760E5BF37EC4EB4AD24EE74FE8F7967D89625308951BE372349783011E5A5025CE8366F0D8FFAEA13CA513014AA611B058AC57BBC70D9682D3A6E39025C410C2E71DCF2F91E276DB13E7C8

要写一个
int Encrypt(char *out,char *in,unsigned int len,char *keystr,char *modstr)
{
}
参数说明:len 为加密内容长度,
          keystr为RSA密匙
          modstr为模n
返回: 加密/解密后的密文/明文的长度

这里面是不是关系到长乘法的问题,会不会导致溢出
菜鸟 请叫,请教
 楼主| 发表于 2007-7-14 16:40:45 | 显示全部楼层
忘说了
加密的内容可以是数字,也可以是字符
in 为要加密的内容
out为输出的密文或者明文
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-14 21:49:07 | 显示全部楼层
首先得把字符串 转变成 数值?

我看到的代码都是直接进行数值运算

可这里加密的内容可能是字符,而且模n和key都是字符串,这个问题要怎么解决?

而加密的内容要进行流处理?
回复 支持 反对

使用道具 举报

发表于 2007-7-18 14:37:58 | 显示全部楼层
可以用sscanf
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表