C++ GMP库实现任意位数的Montgomery Modular Multiplication

嗯刚刚终于搞定了大数运算真是让我异常感动于是我又选择了来记录一下这次历程。

本来是想用C++实现一个MMM来测试verilog写出来的对不对的,刚开始觉得很容易啊不就把计算过程一写就好了,然而写到32位的时候求n'的时候需要用到r * r-1就发现溢出了……然后就不得不寻求大数运算的方法。


然而由于我太懒了不想自己动手写big integer,自己这方面的知识又很匮乏不知道有没有什么现成的工具,然后就搜了一下发现了GNU的GMP库然后就准备试一下了。


然而感觉网上很少配置GMP库的相关教程?或者也可能是我的打开方式不对,总之谷歌和度娘都搜不到太多有用的,只搜到了唯一一篇windows下配置GMP库的博客,还好良心博主的方法肥肠好用,终于不像之前装软件那样痛苦不堪。以下也就再写一下GMP库的安装方法,和GMP的C++ interface的使用(就用我的MMM代码啦)吧。


-------------------------------------------------------------------------------------以上是废话以下是正文的分割线------------------------------------------------------------------------------------------------


一、GMP库在Windows下的配置

参考文章:http://blog.csdn.net/u012629110/article/details/51220727

Emmm这篇文章里面已经讲得非常详细啦我就懒得再写一遍了(明明刚刚还想重新写的然而太懒了orz),配置过程中没出现什么大问题,就是本来昨天下午

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
RSA是一种非对称加密算法,公开密钥可以用于加密,私有密钥可以用于解密。在RSA算法中,公开密钥是由两个大素数的乘积N和另一个整数e组成的。私有密钥是由一个整数d组成的。RSA算法的加密和解密过程都涉及到了大数模幂运算。在实现RSA算法时,Montgomery模幂和Binary模幂是两种常用的算法。 Montgomery模幂算法是一种快速模幂算法,它通过将模数转换为另一个数来加速模幂运算。在Montgomery模幂算法中,模数是一个2的幂次。该算法需要预处理一些参数,但一旦预处理完成,每次模幂运算的时间复杂度都是O(log n)级别的,其中n是模数的位数。 Binary模幂算法是另一种常用的模幂算法,它是一种递归算法。在Binary模幂算法中,指数被表示为二进制数,然后从低位到高位进行幂运算。该算法的时间复杂度也是O(log n)级别的,但是它不需要预处理任何参数。 下面是使用openssl实现RSA算法的示例代码,其中包括Montgomery模幂和Binary模幂两种算法的实现: ``` #include <openssl/rsa.h> #include <openssl/pem.h> // 使用Montgomery模幂实现RSA加密 int rsa_encrypt_montgomery(const unsigned char *in, int inlen, unsigned char *out, RSA *rsa, int padding) { int rsa_len = RSA_size(rsa); unsigned char *buf = (unsigned char *)malloc(rsa_len); // 将模数转换成Montgomery形式 BN_CTX *ctx = BN_CTX_new(); BN_MONT_CTX *mont_ctx = BN_MONT_CTX_new(); BN_MONT_CTX_set(mont_ctx, rsa->n, ctx); // 对输入数据进行加密 int ret = RSA_public_encrypt(inlen, in, buf, rsa, padding); // 对加密结果进行Montgomery还原 BN_from_montgomery(buf, buf, mont_ctx, ctx); // 将结果拷贝到输出缓冲区 memcpy(out, buf, rsa_len); // 释放内存 BN_MONT_CTX_free(mont_ctx); BN_CTX_free(ctx); free(buf); return ret; } // 使用Binary模幂实现RSA加密 int rsa_encrypt_binary(const unsigned char *in, int inlen, unsigned char *out, RSA *rsa, int padding) { int rsa_len = RSA_size(rsa); unsigned char *buf = (unsigned char *)malloc(rsa_len); // 对输入数据进行加密 int ret = RSA_public_encrypt(inlen, in, buf, rsa, padding); // 将结果拷贝到输出缓冲区 memcpy(out, buf, rsa_len); // 释放内存 free(buf); return ret; } // 测试RSA加密 int main() { RSA *rsa = RSA_generate_key(2048, RSA_F4, NULL, NULL); unsigned char in[] = "hello world"; unsigned char out_montgomery[256]; unsigned char out_binary[256]; int outlen_montgomery = rsa_encrypt_montgomery(in, strlen((char *)in), out_montgomery, rsa, RSA_PKCS1_PADDING); int outlen_binary = rsa_encrypt_binary(in, strlen((char *)in), out_binary, rsa, RSA_PKCS1_PADDING); printf("Montgomery: %d\n", outlen_montgomery); printf("Binary: %d\n", outlen_binary); RSA_free(rsa); return 0; } ``` 从上述代码中可以看出,Montgomery模幂算法需要进行模数转换和Montgomery还原,而Binary模幂算法不需要。在实际应用中,Montgomery模幂算法通常比Binary模幂算法更快,因为它避免了一些不必要的模运算。但是,Montgomery模幂算法的预处理过程需要一些额外的时间和空间,因此在处理小数据时,Binary模幂算法可能更适合。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值