【密码学】一文读懂RSA的随机数生成器

简介: 本文接着来聊一个比较轻松的内容,再来说一个随机数生成器,对于这个随机数生成器呢,这里和之前讲到过的BBS有一些类似,直接来看具体的内容蛤。

【密码学】一文读懂RSA的随机数生成器


%}LAL4H8}@USBB83LJ1]KT0.jpgRSA随机数生成器

本文接着来聊一个比较轻松的内容,再来说一个随机数生成器,对于这个随机数生成器呢,这里和之前讲到过的BBS有一些类似,直接来看具体的内容蛤。

这个随机数生成器的结构是真的简单,如果有实现好的大数运算的语言,基本上就只有一行核心的代码,相信各位读者看完我的代码实现之后,就会明白了。


算法过程

设p、q为两个k/2 bit长的素数,计算 ,随机选择一个b使得b满足 ,其中n和b是公开的,p和q是保密的。

在这里我们简单的来回顾一下rsa加密的过程,首选选取两个大素数p和q,然后计算 ,之后选取e满足 其中(n, e)作为公钥,这一块过程和RSA加密算法非常相似,因此呢,这个随机数生成器的名字就是这么来的。

好了,回忆完成RSA的加密算法,我们回过头开看随机数是怎样生成的,首先在 选择一个k比特长度的数字 作为种子。对于 定义如下的递推公式:

image.png

然后定义随机比特生成的函数:

image.png

其中:

image.png

这里,整个随机数生成器的过程就完成了,最后来一张简单的处理过程图吧。

image.gifRSA随机数生成器


代码实现

这里回归一下,因为算法比较简单,咱们还是用两种语言来实现

package rsa
import "math/big"
type RSAPRNG struct {
  p  big.Int
  q  big.Int
  b  big.Int
  s0 big.Int
  n  big.Int
}
func New(p, q, b, s0 big.Int) *RSAPRNG {
  n := new(big.Int)
  n.Mul(&p, &q)
  return &RSAPRNG{p, q, b, s0, *n}
}
func (r *RSAPRNG) PRNG() big.Int {
  r.s0.Exp(&r.s0, &r.b, &r.n)
  return r.s0
}

回归我的老本行语言,咱们再来rust来实现一下

use num_bigint::BigUint;
struct RSAPRNG {
    p: BigUint,
    q: BigUint,
    b: BigUint,
    s0: BigUint,
    n: BigUint,
}
impl RSAPRNG {
    pub fn new(p: &BigUint, q: &BigUint, b: &BigUint, s0: &BigUint) -> RSAPRNG {
        let n = p * q;
        RSAPRNG { p: p.clone(), q: q.clone(), b: b.clone(), s0: s0.clone(), n }
    }
    pub fn next(&mut self) -> BigUint {
        self.s0 = self.s0.modpow(&self.b, &self.n);
        self.s0.clone()
    }
}


相关文章
|
算法 网络安全 数据安全/隐私保护
【密码学】手摸手带你手算AES
本文带着大家手动计算了一下完整的简化版AES的整个流程,其实主要都参考了密码学与网络安全这本书,大部分的公式都是从这本书上来的,我是真的喜欢这个例子,麻雀虽小,五脏俱全,用来学习AES的入门感觉非常的合适,如果能够完整的自己手算下来这个例子,然后再去看完整版的AES算法,会简单非常多,主要就是规模扩大了一下,核心的流程还是上面这一套。最后,感谢能看到这里的读者,如果本文对大佬们理解AES有一点点的帮助,也不枉我手动敲了这么多的公式和矩阵了。
1331 0
【密码学】手摸手带你手算AES
|
Android开发 芯片 开发者
adb 查看安卓手机 CPU 类型(armeabi、armeabi-v7a、arm64-v8a ...)
adb 查看安卓手机 CPU 类型(armeabi、armeabi-v7a、arm64-v8a ...)
3905 0
|
存储 Rust 并行计算
【密码学】一文读懂XTS模式
这篇文章的灵感来源于我偶然翻到的一个某U盘有关磁盘加密的一个介绍(这一篇不是广告蛤), 然后发现这个模式我之前还真没遇到过,因此呢,就学习了一下,就出来了这一篇文章。
7925 0
【密码学】一文读懂XTS模式
|
Rust 安全 算法
【密码学】一文读懂BBS
之前聊过不少非密码学安全的伪随机数生成算法,这次呢,咱们来聊一个密码学安全的伪随机数生成器 「BBS」 ,这个是三位设计者的首字母: Blum、Blum 和 Shub。
1061 0
【密码学】一文读懂BBS
|
存储 NoSQL 安全
【MongoDB】MongoDB可查询加密简介
MongoDB 6.0引入了一个预览功能,它实现了一个近乎神奇的功能,即允许将加密数据用作搜索目标,而无需将密钥传输到数据库。
|
11月前
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
13759 12
|
Unix Linux iOS开发
计算文件内容的SHA-256散列值
计算文件内容的SHA-256散列值
752 7
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
JavaScript 前端开发
成功解决:jQuery is not defined
这篇文章介绍了如何解决在使用jQuery时浏览器控制台报错`jQuery is not defined`的问题,通过在webpack配置文件中添加特定的插件配置来确保jQuery被正确加载和使用。
成功解决:jQuery is not defined
|
存储 XML JSON
【TCP】核心机制:延时应答、捎带应答和面向字节流
【TCP】核心机制:延时应答、捎带应答和面向字节流
259 2