四种加密算法之RSA源代码-C++

RSA.h文件:

//! RSA 动态链接库实现   H文件
/*!
 @author 朱孟斌
 @e-mail  [email protected]
 @version 1.0
 @date 2011-03
 @{
*/
#ifndef RSA_H
#define RSA_H

#include <stdio.h>
#include <string>
#include <stdlib.h>   
#include <time.h>  
#include <math.h>
#include <malloc.h>
#include <iostream>
#include <ppl.h>

using namespace std;
using namespace Concurrency;
//! MAX是数组的最大个数,LEN为结构体slink的占用内存空间大小 */
#define MAX 100
#define LEN sizeof(struct slink)
//!   #能够进行动态链接库编译的RSA类
 /*!  
       @see class _declspec(dllexport) RSA
       将RSA算法写成动态链接库的形式方便调用,其中有公钥,私钥和明文
	   就可以进行明文的加密和解密
 */
class _declspec(dllexport) RSA
{
public:

	//! # 新定义的数据结构slink
	/*!  
	 @see struct slink
	 数据结构中,bignum存储的是随机生成的大数,next是指向后面的指针
	 @see int bignum[MAX]
	 */
	typedef struct slink
	{
		int  bignum[MAX];/*!< bignum[98]用来标记正负号,1正,0负bignum[99]来标记实际长度*/
		struct slink *next;
	}slink;

public:
	//! #RSA 的构造函数
    /*!
	 @see RSA()
      其中应该对RSA类中的一些变量进行相应的初始化
    */
	RSA();
	//! #RSA的析构函数
    /*!
	@see ~RSA()
      释放内存
    */
	~RSA();

public:
	//! #RSA的大数运算函数库

    /** @大数比较函数
	@see int cmp(int, int)
	*/
	int cmp(int a1[MAX],int a2[MAX]);
	/** @大数类型转换函数
	@see void mov(int a[MAX],int *b);
	*/
	void mov(int a[MAX],int *b);
	 /** @大数乘积函数
	 @see void mul(int a1[MAX],int a2[MAX],int *c);
	 */
	void mul(int a1[MAX],int a2[MAX],int *c);
	 /** @大数相加函数
	 @see void add(int a1[MAX],int a2[MAX],int *c);
	 */
    void add(int a1[MAX],int a2[MAX],int *c);
	 /** @大数大数相减函数
	 @see  void sub(int a1[MAX],int a2[MAX],int *c);
	 */
    void sub(int a1[MAX],int a2[MAX],int *c);
	 /*! @大数取模函数
	 @see void mod(int a[MAX],int b[MAX],int  *c);
	 @attention /c=a mod b//注意:经检验知道此处A和C的数组都改变了。
	 */
	void mod(int a[MAX],int b[MAX],int  *c);
	/*! @大数相除函数
	@see void divt(int t[MAX],int b[MAX],int  *c ,int *w);
	@attention //试商法//调用以后w为a mod b, C为a  div b;
	*/
	void divt(int t[MAX],int b[MAX],int  *c ,int *w);
	/*! @解决 了 m=a*b mod n;
	/*!
	@see void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m);
	*/
	void mulmod(int a[MAX] ,int b[MAX] ,int n[MAX],int *m);
	/*! @解决 m=a^p  mod n的函数问题
	/*!
	@see void expmod(int a[MAX] ,int p[MAX] ,int n[MAX],int *m);
	*/
	void expmod(int a[MAX] ,int p[MAX] ,int n[MAX],int *m);
	/*!  @判断是否为素数
	@see int   is_prime_san(int p[MAX] );
	*/
	int   is_prime_san(int p[MAX] );
	/*! @判断两个大数之间是否互质
	@see int coprime(int e[MAX],int s[MAX]);
	*/
	int coprime(int e[MAX],int s[MAX]);
	/*!  @随机产生素数
	@see void prime_random(int *p,int *q);
	*/
	void prime_random(int *p,int *q);
	/*! @产生素数e
	@see void erand(int e[MAX],int m[MAX]);
	*/
	void erand(int e[MAX],int m[MAX]);
	/*! @根据规则产生其他的数
	@see void rsad(int e[MAX],int g[MAX],int *d);
	*/
	void rsad(int e[MAX],int g[MAX],int *d);
	/*! @求解密密钥d的函数(根据Euclid算法)
	@see unsigned long  rsa(unsigned long p,unsigned long q,unsigned long e);
	*/
	unsigned long  rsa(unsigned long p,unsigned long q,unsigned long e);
	
   //! #RSA的产生大数的公钥和私钥的函数
    /*!
	  @see bool RSAKey();
	  @param 没有任何输入,
      @param 随机产生e,d,n的函数,其运行时间比较长,需要等待
	  @return[bool] 成功返回true,失败返回false
    */
	bool RSAKey();

	//!  #RSA的进行文件加密的函数
    /*!
	  @see string tencrypto(int e[MAX], int n[MAX], char* text);
	  @param[int[] e,n为随机产生的公钥,利用公钥进行加密
      @param[char* text为明文,明文以char*的格式存储
	  @return[string] 返回值为加密成功之后的密文,采用string类型进行存储
    */
	string tencrypto(int e[MAX], int n[MAX], char* text);

    //! #RSA的进行文件解密的函数
    /*!
	  @see string tdecrypto(int d[MAX], int n[MAX], string text);
	  @param[int[] d,n为私钥,由函数RSAKey()产生
      @param[string text为密文,对应加密函数࿰
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是C++实现的RSA加密算法代码,其中包括密钥生成,加密解密功能。 ```c++ #include <iostream> #include <cmath> using namespace std; // 求最大公约数 int gcd(int a, int b) { if (b == 0) return a; else return gcd(b, a % b); } // 求扩展欧几里得算法的 x 值 int extended_gcd(int a, int b, int &x, int &y) { if (b == 0) { x = 1; y = 0; return a; } int gcd = extended_gcd(b, a % b, x, y); int tmp = x; x = y; y = tmp - a / b * y; return gcd; } // 计算 a^b mod n int fast_power_mod(int a, int b, int n) { int ans = 1; while (b) { if (b & 1) ans = (ans * a) % n; a = (a * a) % n; b >>= 1; } return ans; } // 生成 RSA 密钥 void generate_rsa_key(int p, int q, int &n, int &e, int &d) { // 计算 n = p * q n = p * q; // 计算φ(n) = (p - 1) * (q - 1) int phi_n = (p - 1) * (q - 1); // 随机选择一个整数 e,满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1 e = 65537; //常用值,可以加快加密解密速度 while (gcd(e, phi_n) != 1) e++; // 计算 d,使得 e * d ≡ 1 (mod φ(n)) int x, y; extended_gcd(e, phi_n, x, y); d = (x % phi_n + phi_n) % phi_n; } // RSA 加密 int rsa_encrypt(int msg, int e, int n) { return fast_power_mod(msg, e, n); } // RSA 解密 int rsa_decrypt(int cipher, int d, int n) { return fast_power_mod(cipher, d, n); } int main() { int p = 61; int q = 53; int n, e, d; generate_rsa_key(p, q, n, e, d); int msg = 12345; int cipher = rsa_encrypt(msg, e, n); int decrypted_msg = rsa_decrypt(cipher, d, n); cout << "p = " << p << endl; cout << "q = " << q << endl; cout << "n = " << n << endl; cout << "e = " << e << endl; cout << "d = " << d << endl; cout << "Message: " << msg << endl; cout << "Encrypted Message: " << cipher << endl; cout << "Decrypted Message: " << decrypted_msg << endl; return 0; } ``` 需要注意的是,RSA加密算法是一种非常安全的加密算法,但是在实际应用中,需要注意密钥的保护和管理,避免密钥被泄露。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值