rsa在线加密解密(RSA加密解密过程)

2023-09-07 06:40:02 53

rsa在线加密解密(RSA加密解密过程)

本文目录

RSA加密解密过程


为了这道题把好几年前学的东西重新看了一遍,累觉不爱。。。

不清楚你了不了解RSA过程,先跟说一下吧

  1. 随机产生两个大素数p和q作为密钥对。此题:p=13,q=17,n =p*q=221

  2. 随机产生一个加密密钥e,使e 和(p-1)*(q-1)互素。此题:e=83

  3. 公钥就是(n,e)。此题:(221,83)

  4. 通过e*d mod (p-1)*(q-1)=1生成解密密钥d, ,n与d也要互素。此题:(d*83)≡1mod192

  5. 私钥就是(n,d)。此题:(221,155)

  6. 之后发送者用公钥加密明文M,得到密文C=M^e mod n

  7. 接受者利用私钥解密M=C^d mod n

求解d呢,就是求逆元,de = 1 mod n这种形式就称de于模数n说互逆元,可以看成de-ny=1,此题83e-192y=1.

用扩展的欧几里得算法。其实就是辗转相除

此题:

192=2*83+26

83=3*26+5

26=5*5+1

求到余数为1了,就往回写

1=26-5*5

  =26-5*(83-3*26)

  =(192-2*83)-5*(83-3*(192-2*83))

 =16*192-37*83

则d=-37,取正后就是155.

记住,往回写的时候数不该换的一定不要换,比如第二步中的26,一定不能换成(83-5)/3,那样就求不出来了,最终一定要是192和83相关联的表达式。还有,最好保持好的书写格式,比如第一步2*83+26时第二步最好写成3*26+5而不是26*3+5,要不步骤比较多的话容易乱


求正确的RSA加密解密算法C语言的,多谢


//rsa.h
#include 《stdio.h》
#define MAX_NUM 63001
#define MAX_PRIME 251
//! 返回代码
#define OK 100
#define ERROR_NOEACHPRIME 101
#define ERROR_NOPUBLICKEY 102
#define ERROR_GENERROR 103
unsigned int MakePrivatedKeyd( unsigned int uiP, unsigned int uiQ );
unsigned int GetPrivateKeyd( unsigned int iWhich );
unsigned int MakePairkey( unsigned int uiP, unsigned int uiQ, unsigned int uiD );
unsigned int GetPairKey( unsigned int &d, unsigned int &e );
void rsa_encrypt( int n, int e, char *mw, int iLength, int *&cw );
void rsa_decrypt( int n, int d, int *&cw, int cLength, char *mw );
void outputkey();
//rsa.c
#include “rsa.h“
//! 保存私钥d集合
struct pKeyset
{
unsigned int set[ MAX_NUM ];
unsigned int size;
}pset;
//! 保存公、私钥对
struct pPairkey
{
unsigned int d;
unsigned int e;
unsigned int n;
}pairkey;
// 名称:isPrime
// 功能:判断两个数是否互质
//  参数:m: 数a; n: 数b
// 返回:m、n互质返回true; 否则返回false
bool isPrime( unsigned int m, unsigned int n )
{
unsigned int i=0;
bool Flag = true;
if( m《2 || n《2 )
return false;
unsigned int tem = ( m 》 n ) ? n : m;
for( i=2; i《=tem && Flag; i++ )
{
bool mFlag = true;
bool nFlag = true;
if( m % i == 0 )
mFlag = false;
if( n % i == 0 )
nFlag = false;
if( !mFlag && !nFlag )
Flag = false;
}
if( Flag )
return true;
else
return false;
}
// 名称:MakePrivatedKeyd
// 功能:由素数Q、Q生成私钥d
//  参数:uiP: 素数P; uiQ: 素数Q
// 返回:私钥d
unsigned int MakePrivatedKeyd( unsigned int uiP, unsigned int uiQ )
{
unsigned int i=0;
//! 得到所有与z互质的数( 私钥d的集合 )
unsigned int z = ( uiP -1 ) * ( uiQ -1 );
pset.size = 0;
for( i=0; i《z; i++ )
{
if( isPrime( i, z ) )
{
pset.set[ pset.size++ ] = i;
}
}
return pset.size;
}
// 名称:MakePairKey
// 功能:生成RSA公、私钥对
//  参数:uiP: 素数P; uiQ: 素数Q; uiD: 私钥d
// 返回:错误代码
unsigned int MakePairkey( unsigned int uiP, unsigned int uiQ, unsigned int uiD )
{
bool bFlag = true;
unsigned int i = 0, e;
unsigned int z = ( uiP-1 ) * ( uiQ-1 );
unsigned int d = pset.set[uiD];
//d=uiD;
if( !isPrime( z, d ) )
return ERROR_NOEACHPRIME;
for( i=2; i《z; i++ )
{
if( (i*d)%z == 1 )
{
e = i;
bFlag = false;
}
}
if( bFlag )
return ERROR_NOPUBLICKEY;
if( (d*e)%z != 1 )
ERROR_GENERROR;
pairkey.d = d;
pairkey.e = e;
pairkey.n = uiP * uiQ;
return OK;
}
// 名称:GetPairKey
// 功能:对外提供接口,获得公、私钥对
//  参数:uiP: 素数P; uiQ: 素数Q; uiD: 私钥d
// 返回:
unsigned int GetPairKey( unsigned int &d, unsigned int &e )
{
d = pairkey.d;
e = pairkey.e;
return pairkey.n;
}
// 名称:GetPrivateKeyd
// 功能:对外提供接口,由用户选择ID得以私钥d
//  参数:iWhich: 用户选择私钥d的ID
// 返回:私钥d值
unsigned int GetPrivateKeyd( unsigned int iWhich )
{
if( pset.size 》= iWhich )
return pset.set[ iWhich ];
else
return 0;
}
// 名称:rsa_encrypt
// 功能:RSA加密运算
//  参数:n: 公钥n; e: 公钥e; mw: 加密明文; iLength: 明文长度; cw: 密文输出
// 返回:无
void rsa_encrypt( int n, int e, char *mw, int mLength, int *&cw )
{
int i=0, j=0;
__int64 temInt = 0;
for( i=0; i《mLength; i++ )
{
temInt = mw[i];
if( e!=0 )
{
for( j=1; j《e; j++ )
{
temInt = ( temInt * mw[i] ) % n;
}
}
else
{
temInt = 1;
}
cw[i] = (int)temInt;
}
}
// 名称:rsa_decrypt
// 功能:RSA解密运算
//  参数:n: 私钥n; d: 私钥d; cw: 密文; cLength: 密文长度; mw: 明文输出
// 返回:无
void rsa_decrypt( int n, int d, int *&cw, int cLength, char *mw )
{
int i=0, j=-1;
__int64 temInt = 0;
for( i=0; i《cLength/4; ++i )
{
mw[i] = 0;
temInt = cw[i];
if( d != 0 )
{
for( j=1; j《d; j++ )
{
temInt = (__int64)( temInt * cw[i] ) % n;
}
}
else
{
temInt = 1;
}
mw[i] = (char)temInt;
}
}
void outputkey()
{
printf(“PublicKey(e,n): (%d,%d)\n“,pairkey.e,pairkey.n);
printf(“PrivateKey(d,n): (%d,%d)\n“,pairkey.d,pairkey.n);
}
//main.c
// 工程:RSA
// 功能:RSA加、解密文件
//  作者:jlcss|ExpNIS

#include 《stdio.h》
#include 《afxwin.h》
#include 《math.h》
#include “rsa.h“
#define DECRYPT_FILE “RSA加密密文.txt“
#define ENCRYPT_FILE “RSA解密明文.txt“
//! 约束文件最大2M
#define MAX_FILE 1024*1024*2
// 名称:usage
// 功能:帮助信息
//  参数:应用程序名称
// 返回:提示信息
void Usage( const char *appname )
{
printf( “\n\tusage:rsa -k 素数P 素数Q\n“ );
printf( “\tusage: rsa -e 明文文件 公钥e 公钥n\n“ );
printf( “\tusage: rsa -d 密文文件 私钥d 私钥n\n“ );
}
// 名称:IsNumber
// 功能:判断数字字符数组
//  参数:strNumber:字符数组
// 返回:数字字组数组返回true,否则返回false;
bool IsNumber( const char *strNumber )
{
unsigned int i;
if( !strNumber )
return false;
for ( i = 0 ; i 《 strlen(strNumber) ; i++ )
{
if ( strNumber[i] 《 ’0’ || strNumber[i] 》 ’9’ )
return false;
}
return true;
}
// 名称:IsPrimeNumber
// 功能:判断素数
//  参数:num: 输入整数
// 返回:素数返回true,否则返回false;
bool IsPrimeNumber( unsigned int num )
{
unsigned int i;
if( num 《= 1 )
return false;
unsigned int sqr = (unsigned int)sqrt((double)num);
for( i = 2; i 《= sqr; i++ )
{
if( num % i == 0 )
return false;
}
return true;
}
// 名称:FileIn
// 功能:读取磁盘文件到内存
//  参数:strFile:文件名称;inBuff:指向文件内容缓冲区
// 返回:实际读取内容大小(字节)
int FileIn( const char *strFile, unsigned char *&inBuff )
{
int iFileLen=0, iBuffLen=0;
//! 打开密文文件
CFile file( strFile, CFile::modeRead );
iFileLen = ( int )file.GetLength();
if( iFileLen》MAX_FILE )
{
printf( “文件长度不能大于 %dM,!\n“, MAX_FILE/(1024*1024) );
goto out;
}
iBuffLen = iFileLen;
inBuff = new unsigned char[iBuffLen];
if( !inBuff )
goto out;
ZeroMemory( inBuff, iBuffLen );
file.Read( inBuff, iFileLen );
file.Close();
out:
return iBuffLen;
}
// 名称:FileOut
// 功能:加/解密结果输出到当前目录磁盘文件中
//  参数:strOut指向输出字符缓冲区,输出大小len,strFile为输出文件
// 返回:无
void FileOut( const void *strOut, int len, const char *strFile )
{
//! 输出到文件
CFile outfile( strFile , CFile::modeCreate | CFile::modeWrite );
outfile.Write( strOut , len );
outfile.Close();
}
// 名称:CheckParse
// 功能:校验应用程序入口参数
//  参数:argc等于main主函数argc参数,argv指向main主函数argv参数
// 返回:若参数合法返回true,否则返回false
//  备注:简单的入口参数校验
bool CheckParse( int argc, char** argv )
{
bool bRes = false;
if( argc != 4 && argc != 5 )
goto out;
if( argc == 4 && argv == ’k’ )
{
//! 生成公、私钥对
if( !IsNumber( argv ) || 
!IsNumber( argv ) ||
atoi( argv ) 》 MAX_PRIME ||
atoi( argv ) 》 MAX_PRIME )
goto out;
}
else if( (argc == 5) && (argv == ’e’ || argv == ’d’) )
{
//! 加密、解密操作
if( !IsNumber( argv ) ||
!IsNumber( argv ) ||
atoi( argv ) 》 MAX_NUM ||
atoi( argv ) 》 MAX_NUM )
goto out;
}
else
Usage(*argv);
bRes = true;
out:
return bRes;
}
// 名称:kOption1
// 功能:程序k选项操作:由素数P、Q生成私钥d集合
//  参数:uiP: 程序入口参数P; uiQ: 程序入口参数Q
// 返回:执行正确返回生成私钥数目,否则返回0
unsigned int kOption1( unsigned int uiP, unsigned int uiQ )
{
unsigned int uiRes = 0;
if( !IsPrimeNumber( uiP ) )
{
printf( “P输入错误,P必须为(0, %d]素数“, MAX_PRIME );
return uiRes;
}
if( !IsPrimeNumber( uiQ ) )
{
printf( “Q输入错误,Q必须为(0, %d]素数“, MAX_PRIME );
return uiRes;
}
if( uiP == uiQ )
{
printf( “素数P与素数Q相同,很容易根据公钥n开平方得出素数P和Q,这种加密不安全,请更换素数!\n“ );
return uiRes;
}
printf( “正在生成私钥d集合......\n“ );
uiRes = MakePrivatedKeyd( uiP, uiQ );
return uiRes;
}
//! 程序主函数
int main( int argc, char **argv )
{
unsigned int p , q , d , n , e;//two prime p & q, public key(n, e) , private key(n , d)
CheckParse(argc,  argv );
d=4828; //uid
if(argc == 4)
{
p = atoi( argv );
q = atoi( argv );
MakePrivatedKeyd(p, q);
MakePairkey(p, q, d );
outputkey();
}
else if(argc == 5)
{
char FileName;
strcpy(FileName, argv);
int len;
if(argv == ’e’ )
{
unsigned char *inBuffer=(unsigned char *)malloc(MAX_FILE); //输入缓冲区
int *cw=(int *)malloc(MAX_FILE);
len = FileIn(FileName , inBuffer);
e = atoi(argv);
n = atoi(argv);
rsa_encrypt( n, e, (char *)inBuffer, len, cw );
FileOut( cw, 4*len, DECRYPT_FILE );
}
else if(argv == ’d’)
{
char *Buffer=(char *)malloc(MAX_FILE); //输入缓冲区
int *cw=(int *)malloc(MAX_FILE);
len = FileIn(FileName, (unsigned char *&)cw);
d = atoi(argv);
n = atoi(argv);
rsa_decrypt( n, d, cw, len, Buffer );
FileOut( Buffer, len/4, ENCRYPT_FILE );
}
}
return 0;
}

如何利用OpenSSL库进行RSA加密和解密


#include《stdio.h》
#include《stdlib.h》
#include《string.h》
#include《openssl/rsa.h》
#include《openssl/engine.h》
int main(int argc, char* argv)
{
   printf(“openssl_test begin\n“);
   RSA* rsa=NULL;
   char originstr=“hello\n“;   //这是我们需要加密的原始数据
   //allocate RSA structure,首先需要申请一个RSA结构题用于存放生成的公私钥,这里rsa就是这个结构体的指针
   rsa = RSA_new();
   if(rsa==NULL)
    {
         printf(“RSA_new failed\n“);          
         return -1;
    }
    //generate RSA keys
   BIGNUM* exponent;
    exponent = BN_new();        //生成RSA公私钥之前需要选择一个奇数(odd number)来用于生成公私钥
    if(exponent ==NULL)
    {
       printf(“BN_new failed\n“); 
       goto FAIL1;
    }
    if(0==BN_set_word(exponent,65537))    //这里选择奇数65537
    {
      printf(“BN_set_word failed\n“); 
      goto FAIL1;
    }
    
    
    //这里modulus的长度选择4096,小于1024的modulus长度都是不安全的,容易被破解
    if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL))  
    {
       printf(“RSA_generate_key_ex failed\n“); 
       goto FAIL;      
    }
    char* cipherstr = NULL;
    //分配一段空间用于存储加密后的数据,这个空间的大小由RSA_size函数根据rsa算出
    cipherstr = malloc(RSA_size(rsa)); 
    if(cipherstr==NULL)
    {
       printf(“malloc cipherstr buf failed\n“);
       goto FAIL1;
    }
   //下面是实际的加密过程,最后一个参数padding type,有以下几种。    
/*
RSA_PKCS1_PADDINGPKCS #1 v1.5 padding. This currently is the most widely used mode.
RSA_PKCS1_OAEP_PADDING
EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications.
RSA_SSLV23_PADDING
PKCS #1 v1.5 padding with an SSL-specific modification that denotes that the server is SSL3 capable.
RSA_NO_PADDING
Raw RSA encryption. This mode should only be used to implement cryptographically sound padding modes in the application code. Encrypting user data directly with RSA is insecure.
*/  
  //这里首先用公钥进行加密,选择了RSA_PKCS1_PADDING
  if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING))
    {
       printf(“encryption failure\n“);
        goto FAIL2;
    }
    printf(“the original string is %s\n“,originstr);
    printf(“the encrypted string is %s\n“,cipherstr);

    //Now, let’s decrypt the string with private key
    //下面来用私钥解密,首先需要一个buffer用于存储解密后的数据,这个buffer的长度要足够(小于RSA_size(rsa))
    //这里分配一个长度为250的字符数组,应该是够用的。
    char decrypted_str;
    int decrypted_len;
    if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING)))
    {
       printf(“decryption failure\n“);
        goto FAIL2;
    }
    printf(“decrypted string length is %d,decryped_str is %s\n“,decrypted_len,decrypted_str);
FAIL2:
      free(cipherstr);
FAIL1:
    BN_free(exponent);
FAIL:
   RSA_free(rsa);
   return 0;
}

以上是源代码,下面使用下面的编译命令在源码所在路径下生成可执行文件
    gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include
其中,-lcrypto和-ldl是必须的,前者是OpenSSL中的加密算法库,后者是用于成功加载动态库。


rsa加密和解密的理论依据是什么


以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我无关。但是,看了很多关于RSA加密算法原理的资料之后,我发现其实原理并不是我们想象中那么复杂,弄懂之后发现原来就只是这样而已..
  学过算法的朋友都知道,计算机中的算法其实就是数学运算。所以,再讲解RSA加密算法之前,有必要了解一下一些必备的数学知识。我们就从数学知识开始讲解。
必备数学知识
  RSA加密算法中,只用到素数、互质数、指数运算、模运算等几个简单的数学知识。所以,我们也需要了解这几个概念即可。
素数
  素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。这个概念,我们在上初中,甚至小学的时候都学过了,这里就不再过多解释了。
互质数
  百度百科上的解释是:公因数只有1的两个数,叫做互质数。;维基百科上的解释是:互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
  常见的互质数判断方法主要有以下几种:
两个不同的质数一定是互质数。例如,2与7、13与19。
一个质数,另一个不为它的倍数,这两个数为互质数。例如,3与10、5与 26。
相邻的两个自然数是互质数。如 15与 16。
相邻的两个奇数是互质数。如 49与 51。
较大数是质数的两个数是互质数。如97与88。
小数是质数,大数不是小数的倍数的两个数是互质数。例如 7和 16。
2和任何奇数是互质数。例如2和87。
1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
辗转相除法。
指数运算
  指数运算又称乘方计算,计算结果称为幂。nm指将n自乘m次。把nm看作乘方的结果,叫做”n的m次幂”或”n的m次方”。其中,n称为“底数”,m称为“指数”。
模运算
  模运算即求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。
  两个整数a,b,若它们除以正整数m所得的余数相等,则称a,b对于模m同余,记作: a ≡ b (mod m);读作:a同余于b模m,或者,a与b关于模m同余。例如:26 ≡ 14 (mod 12)。
RSA加密算法
RSA加密算法简史
  RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
公钥与密钥的产生
  假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
随意选择两个大的质数p和q,p不等于q,计算N=pq。
根据欧拉函数,求得r = (p-1)(q-1)
选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
将 p 和 q 的记录销毁。
(N,e)是公钥,(N,d)是私钥。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
加密消息
  假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:
  ne ≡ c (mod N)
计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:
  cd ≡ n (mod N)
得到n后,她可以将原来的信息m重新复原。
解码的原理是:
  cd ≡ n e·d(mod N)
以及ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。由费马小定理可证明(因为p和q是质数)
  n e·d ≡ n (mod p)   和  n e·d ≡ n (mod q)
这说明(因为p和q是不同的质数,所以p和q互质)
  n e·d ≡ n (mod pq)
签名消息
  RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Message digest),然后用她的密钥(private key)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
RSA加密算法的安全性
  当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。然而,虽然RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。
  1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)
  另外,假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的N。1997年后开发的系统,用户应使用1024位密钥,证书认证机构应用2048位或以上。
RSA加密算法的缺点
  虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点:
产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,。

RSA加密解密问题


首先建议您可以和这款软件的作者和客服人员联系一下,看是否有解决办法。
您以后可以选择专业的加密软件来给您的文件和文件夹加密。
文件夹加密超级大师是文件加密软件中非常不错的选择。
文件夹加密超级大师是专业的文件加密软件,文件加密后如果需要使用,只需要输入正确密码,点击打开,使用完毕后,文件就自动回复到加密状态了。
文件夹加密超级大师的功能相当的强大,您可以到百度上搜索文件夹加密超级大师给您的文件和文件夹加密试试,看看加密效果怎么样?

简述RSA体制密钥的生成及其加密、解密算法


 RSA体制密钥的生成:
  1. 选择两个大素数,p 和q 。
  
  2. 计算: n = p * q (p,q分别为两个互异的大素数,p,q 必须保密,一般要求p,q为安全素数,n的长度大于512bit ,这主要是因为RSA算法的安全性依赖于因子分解大数问题)。有欧拉函数 (n)=(p-1)(q-1)。
  
  3. 然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。
  
  4. 最后,利用Euclid 算法计算解密密钥d, 满足de≡1(mod φ(n))。其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。

加密、解密算法:

1. 加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s 《= n, s 尽可能的大。
  
  2. 对应的密文是:ci ≡mi^e ( mod n ) ( a )
  
  3. 解密时作如下计算:mi ≡ci^d ( mod n ) ( b ) RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。

请教C#实现RSA加密解密!


using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
namespace Microsoft.Samples.Security.PublicKey
{
class App
{
// Main entry point
static void Main(string args)
{
// Instantiate 3 People for example. See the Person class below
Person alice = new Person(“Alice“);
Person bob = new Person(“Bob“);
Person steve = new Person(“Steve“);
// Messages that will exchanged. See CipherMessage class below
CipherMessage aliceMessage;
CipherMessage bobMessage;
CipherMessage steveMessage;
// Example of encrypting/decrypting your own message
Console.WriteLine(“Encrypting/Decrypting Your Own Message“);
Console.WriteLine(“-----------------------------------------“);
// Alice encrypts a message using her own public key
aliceMessage = alice.EncryptMessage(“Alice wrote this message“);
// then using her private key can decrypt the message
alice.DecryptMessage(aliceMessage);
// Example of Exchanging Keys and Messages
Console.WriteLine();
Console.WriteLine(“Exchanging Keys and Messages“);
Console.WriteLine(“-----------------------------------------“);
// Alice Sends a copy of her public key to Bob and Steve
bob.GetPublicKey(alice);
steve.GetPublicKey(alice);
// Bob and Steve both encrypt messages to send to Alice
bobMessage = bob.EncryptMessage(“Hi Alice! - Bob.“);
steveMessage = steve.EncryptMessage(“How are you? - Steve“);
// Alice can decrypt and read both messages
alice.DecryptMessage(bobMessage);
alice.DecryptMessage(steveMessage);
Console.WriteLine();
Console.WriteLine(“Private Key required to read the messages“);
Console.WriteLine(“-----------------------------------------“);
// Steve cannot read the message that Bob encrypted
steve.DecryptMessage(bobMessage);
// Not even Bob can use the Message he encrypted for Alice.
// The RSA private key is required to decrypt the RS2 key used
// in the decryption.
bob.DecryptMessage(bobMessage);
} // method Main
} // class App
class CipherMessage
{
public byte cipherBytes; // RC2 encrypted message text
public byte rc2Key; // RSA encrypted rc2 key
public byte rc2IV; // RC2 initialization vector
}
class Person
{
private RSACryptoServiceProvider rsa;
private RC2CryptoServiceProvider rc2;
private string name;
// Maximum key size for the RC2 algorithm
const int keySize = 128;
// Person constructor
public Person(string p_Name)
{
rsa = new RSACryptoServiceProvider();
rc2 = new RC2CryptoServiceProvider();
rc2.KeySize = keySize;
name = p_Name;
}
// Used to send the rsa public key parameters
public RSAParameters SendPublicKey()
{
RSAParameters result = new RSAParameters();
try
{
result = rsa.ExportParameters(false);
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
return result;
}
// Used to import the rsa public key parameters
public void GetPublicKey(Person receiver)
{
try
{
rsa.ImportParameters(receiver.SendPublicKey());
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
}
public CipherMessage EncryptMessage(string text)
{
// Convert string to a byte array
CipherMessage message = new CipherMessage();
byte plainBytes = Encoding.Unicode.GetBytes(text.ToCharArray());
// A new key and iv are generated for every message
rc2.GenerateKey();
rc2.GenerateIV();
// The rc2 initialization doesnt need to be encrypted, but will
// be used in conjunction with the key to decrypt the message.
message.rc2IV = rc2.IV;
try
{
// Encrypt the RC2 key using RSA encryption
message.rc2Key = rsa.Encrypt(rc2.Key, false);
}
catch (CryptographicException e)
{
// The High Encryption Pack is required to run this sample
// because we are using a 128-bit key. See the readme for
// additional information.
Console.WriteLine(“Encryption Failed. Ensure that the“ +
“ High Encryption Pack is installed.“);
Console.WriteLine(“Error Message: “ + e.Message);
Environment.Exit(0);
}
// Encrypt the Text Message using RC2 (Symmetric algorithm)
ICryptoTransform sse = rc2.CreateEncryptor();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, sse, CryptoStreamMode.Write);
try
{
cs.Write(plainBytes, 0, plainBytes.Length);
cs.FlushFinalBlock();
message.cipherBytes = ms.ToArray();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
ms.Close();
cs.Close();
}
return message;
} // method EncryptMessage
public void DecryptMessage(CipherMessage message)
{
// Get the RC2 Key and Initialization Vector
rc2.IV = message.rc2IV;
try
{
// Try decrypting the rc2 key
rc2.Key = rsa.Decrypt(message.rc2Key, false);
}
catch (CryptographicException e)
{
Console.WriteLine(“Decryption Failed: “ + e.Message);
return;
}

ICryptoTransform ssd = rc2.CreateDecryptor();
// Put the encrypted message in a memorystream
MemoryStream ms = new MemoryStream(message.cipherBytes);
// the CryptoStream will read cipher text from the MemoryStream
CryptoStream cs = new CryptoStream(ms, ssd, CryptoStreamMode.Read);
byte initialText = new Byte[message.cipherBytes.Length];
try
{
// Decrypt the message and store in byte array
cs.Read(initialText, 0, initialText.Length);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
ms.Close();
cs.Close();
}
// Display the message received
Console.WriteLine(name + “ received the following message:“);
Console.WriteLine(“ “ + Encoding.Unicode.GetString(initialText));
} // method DecryptMessage
} // class Person
} // namespace PublicKey

rsa加密解密算法


1978年就出现了这种算法,它是第一个既能用于数据加密
也能用于数字签名的算法。它易于理解和操作,也很流行。算
法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和
Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数
( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文
推断出明文的难度等同于分解两个大素数的积。
密钥对的产生:选择两个大素数,p 和q 。计算:
n = p * q
然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 )
互质。最后,利用Euclid 算法计算解密密钥d, 满足
e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
其中n和d也要互质。数e和
n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任
何人知道。 加密信息 m(二进制表示)时,首先把m分成等长数据
块 m1 ,m2,..., mi ,块长s,其中 2^s 《= n, s 尽可能的大。对
应的密文是:
ci = mi^e ( mod n ) ( a )
解密时作如下计算:
mi = ci^d ( mod n ) ( b )
RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )
式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先
作 HASH 运算。
RSA 的安全性。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理
论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在
一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,
RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显
然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,
模数n必须选大一些,因具体适用情况而定。
RSA的速度:
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论
是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据
加密。
RSA的选择密文攻击:
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装
(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信
息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保
留了输入的乘法结构:
( XM )^d = X^d *M^d mod n
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征
--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有
两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体
任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不
对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction
对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不
同类型的攻击方法。
RSA的公共模数攻击。
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险
的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互
质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥
为e1和e2,公共模数是n,则:
C1 = P^e1 mod n
C2 = P^e2 mod n
密码分析者知道n、e1、e2、C1和C2,就能得到P。
因为e1和e2互质,故用Euclidean算法能找到r和s,满足:
r * e1 + s * e2 = 1
假设r为负数,需再用Euclidean算法计算C1^(-1),则
( C1^(-1) )^(-r) * C2^s = P mod n
另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数
的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它
成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享
模数n。
RSA的小指数攻击。 有一种提高
RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度
有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各
种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难
度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性
能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:
A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次
一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits
以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;
且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。
目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长
的密钥,其他实体使用1024比特的密钥。

寻 RSA解密,加密过程


RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。
  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
  RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。
更具体参考《密码学》

rsa在线加密解密(RSA加密解密过程)

本文编辑:admin

更多文章:


jquery监听滚动条的位置(jquery获取滚动条位置)

jquery监听滚动条的位置(jquery获取滚动条位置)

其实jquery监听滚动条的位置的问题并不复杂,但是又很多的朋友都不太了解jquery获取滚动条位置,因此呢,今天小编就来为大家分享jquery监听滚动条的位置的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录jq

2024年7月27日 13:15

investigation是什么意思中文(请教screening,investigation,clearance,check之间区别)

investigation是什么意思中文(请教screening,investigation,clearance,check之间区别)

本文目录请教screening,investigation,clearance,check之间区别“research”和“investigation”的区别是什么research 和 investigation 的区别请教screening

2024年6月16日 02:47

图像处理正则化(在神经网络中常用的技术有哪些)

图像处理正则化(在神经网络中常用的技术有哪些)

其实图像处理正则化的问题并不复杂,但是又很多的朋友都不太了解在神经网络中常用的技术有哪些,因此呢,今天小编就来为大家分享图像处理正则化的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录在神经网络中常用的技术有哪些图

2024年8月2日 14:50

单片机c语言入门书籍(学习单片机C语言编程看什么书好)

单片机c语言入门书籍(学习单片机C语言编程看什么书好)

本文目录学习单片机C语言编程看什么书好我现在在学keil c,关于单片机的请问有什么好书啊学习单片机C语言编程看什么书好首先你要是会C的话,就看单片机C语言教程如郭天祥的《新概念51单片机C语言教程》;如果你不会C语言的话先把C语言学好,学

2024年7月23日 03:43

address的用法及搭配(关于dress的用法及解释)

address的用法及搭配(关于dress的用法及解释)

大家好,今天小编来为大家解答以下的问题,关于address的用法及搭配,关于dress的用法及解释这个很多人还不知道,现在让我们一起来看看吧!本文目录关于dress的用法及解释dress的用法及搭配dress的用法dress的用法及搭配 d

2024年8月24日 09:15

自适应会员中心html模板(点击首页的时候,图标跟字怎么变色,背景色不变点击订单或会员中心的时候,其它还原求前端大神解答)

自适应会员中心html模板(点击首页的时候,图标跟字怎么变色,背景色不变点击订单或会员中心的时候,其它还原求前端大神解答)

本文目录点击首页的时候,图标跟字怎么变色,背景色不变点击订单或会员中心的时候,其它还原求前端大神解答网页制作中如何设置会员或者用户登录功能打开PHPcms会员注册页,最上面的那个名字怎么修改小白求教点击首页的时候,图标跟字怎么变色,背景色不

2024年6月4日 05:21

walk中文是什么(walk的意思是什么)

walk中文是什么(walk的意思是什么)

大家好,walk中文是什么相信很多的网友都不是很明白,包括walk的意思是什么也是一样,不过没有关系,接下来就来为大家分享关于walk中文是什么和walk的意思是什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目

2024年8月16日 10:06

header是什么元素(css中这两个#header nav有什么区别吗)

header是什么元素(css中这两个#header nav有什么区别吗)

本文目录css中这两个#header nav有什么区别吗html5中标签和标签有什么区别header是什么意思header的意思是什么html中 区别是什么为什么CSS要这样写div.headerheader元素和head元素有什么区别H5

2024年1月18日 03:20

c++单元测试工具(c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决)

c++单元测试工具(c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决)

其实c++单元测试工具的问题并不复杂,但是又很多的朋友都不太了解c++开发必备:最好用的单元测试工具:Parasoftc++Test9.0,该如何解决,因此呢,今天小编就来为大家分享c++单元测试工具的一些知识,希望可以帮助到大家,下面我们

2024年9月7日 06:45

win10如何卸载干净mongodb(win10应用程序卸载不干净怎么办)

win10如何卸载干净mongodb(win10应用程序卸载不干净怎么办)

其实win10如何卸载干净mongodb的问题并不复杂,但是又很多的朋友都不太了解win10应用程序卸载不干净怎么办,因此呢,今天小编就来为大家分享win10如何卸载干净mongodb的一些知识,希望可以帮助到大家,下面我们一起来看看这个问

2024年8月6日 17:45

中央人事任免令(党政领导干部职务任期暂行规定)

中央人事任免令(党政领导干部职务任期暂行规定)

大家好,关于中央人事任免令很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于党政领导干部职务任期暂行规定的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录党

2024年8月6日 22:15

网址显示502 bad gateway(502 bad gateway是什么意思怎么解决)

网址显示502 bad gateway(502 bad gateway是什么意思怎么解决)

本文目录502 bad gateway是什么意思怎么解决打开网页出现502 bad gateway是什么意思502 bad gateway是什么意思怎么解决解决如下:502 Bad Gateway是指错误网关,无效网关;在互联网中表示一种网

2024年7月18日 02:05

vb编程语言函数(vb关于Function函数的调用)

vb编程语言函数(vb关于Function函数的调用)

本文目录vb关于Function函数的调用VB考试教程:过程之Function过程VB中的int函数怎么用Visual Studio 2013 使用VB语言编程如何使用数学函数vb函数大全vb的getfolder函数求高手用VB语言编写一个

2024年6月20日 22:17

fisting是什么意思?fist什么意思

fisting是什么意思?fist什么意思

本文目录fisting是什么意思fist什么意思fist中文是什么意思feet 和foot有什么区别fisting是什么意思意思:n. 拳头;《口》手 ;掌握,支配 vt. 紧握;用拳头打读音:英[fɪst]、美[fɪst]  过去式::f

2024年6月30日 12:19

美国google网站入口(请问美国的谷歌地址是什么)

美国google网站入口(请问美国的谷歌地址是什么)

本文目录请问美国的谷歌地址是什么谷歌官网美国本土的GOOGLE网址是什么请问美国的谷歌地址是什么谷歌的地址是:google.com,不过中国只能链接香港的谷歌,所以需要安装穿墙软件才能登录美国的谷歌。Google(中文名:谷歌),是一家美国

2023年12月21日 07:40

字符串截取日期(字符串中提取年月日,year、month、day,格式:year=2012,month=march-April、day=6-8)

字符串截取日期(字符串中提取年月日,year、month、day,格式:year=2012,month=march-April、day=6-8)

本文目录字符串中提取年月日,year、month、day,格式:year=2012,month=march-April、day=6-8从sql表里截取字符串中的日期vb截取字符串 2011-1-12 13:45:09 我要截取年月日,年月日

2024年7月3日 13:23

易语言更新器源码(易语言更新源码)

易语言更新器源码(易语言更新源码)

本文目录易语言更新源码易语言 求检验更新的源码易语言程序快捷通软件写好了我想在软件上面写一个提示版本更新源码如何写易语言检查更新源码跪求易语言检查更新或自动更新源码!易语言怎么写检测更新源码易语言怎么实现自动更新要易语言自动更新源码帮写易语

2024年7月22日 12:55

服务器系统备份(有两台服务器,如何做双机热备份)

服务器系统备份(有两台服务器,如何做双机热备份)

本文目录有两台服务器,如何做双机热备份服务器怎么做定时备份、自动备份服务器备份方式大概有以下几种 详细�0�3服务器系统如何备份才能保证数据万无一失服务器备份该如何进行服务器数据怎样备份服务器差异备份怎么做如何选择正确的服务器备份方法服务器

2024年7月4日 00:34

酒店布草洗涤(酒店洗涤布草如何去碱性)

酒店布草洗涤(酒店洗涤布草如何去碱性)

本文目录酒店洗涤布草如何去碱性我想开个洗涤厂专门洗宾馆布草一类的,需要投资多少钱都需要什么,比如每天500套酒店布草洗涤设备价格是多少急求酒店客房与洗涤公司协议书不知道谁有从事洗涤行业的我想问下这个在收送布草的应注意什么详细流程怎么写开布草

2024年5月26日 21:06

站酷素材网人物素材(站酷素材网的简介)

站酷素材网人物素材(站酷素材网的简介)

本文目录站酷素材网的简介站酷素材网的特色栏目站酷素材网的介绍站酷素材网的简介站酷素材网 专注于提供平面广告设计素材下载,其内容涵盖了psd素材,矢量素材,PPT模板,网站源码,网页素材,flash素材,png图标,ps笔刷等,让任何一个设计

2024年6月29日 01:31

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1156
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1152
标签列表

热门搜索