在 python 中从密码生成 RSA 密钥

2023-12-28

我希望能够生成并再生相同的 RSA 密钥password(和盐)单独在python.

目前我正在使用 pycrypto 进行此操作,但是,它似乎并不能单独从密码生成相同的密钥。原因似乎是当 pycrypto 生成 RSA 密钥时,它在内部使用某种随机数。

目前我的代码如下所示:

import DarkCloudCryptoLib as dcCryptoLib #some costume library for crypto
from Crypto.PublicKey import RSA

password = "password"


new_key1 = RSA.generate(1024) #rsaObj
exportedKey1 = new_key1.exportKey('DER', password, pkcs=1)
key1 = RSA.importKey(exportedKey1)

new_key2 = RSA.generate(1024) #rsaObj
exportedKey2 = new_key2.exportKey('DER', password, pkcs=1)
key2 = RSA.importKey(exportedKey2)
print dcCryptoLib.equalRSAKeys(key1, key2) #wish to return True but it doesn't

我真的不在乎是否必须不使用 pycrypto,只要我可以仅从密码和盐生成这些 RSA 密钥即可。

我在这里先向您的帮助表示感谢。

仅供参考,dcCryptoLib.equalRSAKeys(key1, key2) 函数如下所示:

def equalRSAKeys(rsaKey1, rsaKey2):
    public_key = rsaKey1.publickey().exportKey("DER") 
    private_key = rsaKey1.exportKey("DER") 
    pub_new_key = rsaKey2.publickey().exportKey("DER")
    pri_new_key = rsaKey2.exportKey("DER")
    boolprivate = (private_key == pri_new_key)
    boolpublic = (public_key == pub_new_key)
    return (boolprivate and boolpublic)

注意:此外,我仅使用 RSA 进行身份验证。因此,任何提供安全生成方式的解决方案不对称的从密码生成的签名/验证对于我的应用程序来说是可接受的解决方案。不过,我认为从密码生成 RSA 密钥也是一个应该回答的问题,因为如果使用正确,它似乎很有用。


如果您正在尝试实施认证加密 https://en.wikipedia.org/wiki/Authenticated_encryption使用共享密码的方案,您实际上并不需要 RSA 密钥:您需要的只是用于加密的 AES 密钥和一个HMAC https://www.dlitz.net/software/pycrypto/api/current/Crypto.Hash.HMAC-module.html用于身份验证的密钥。

If you do如果您需要生成一个不知道密码就可以验证的非对称签名,那么您将必须根据密码以确定的方式生成 RSA(或 DSA 等)密钥。基于文档 https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA-module.html, this should可以通过定义自定义randfunc,像这样:

from Crypto.Protocol.KDF import PBKDF2
from Crypto.PublicKey import RSA

password = "swordfish"   # for testing
salt = "yourAppName"     # replace with random salt if you can store one

master_key = PBKDF2(password, salt, count=10000)  # bigger count = better

def my_rand(n):
    # kluge: use PBKDF2 with count=1 and incrementing salt as deterministic PRNG
    my_rand.counter += 1
    return PBKDF2(master_key, "my_rand:%d" % my_rand.counter, dkLen=n, count=1)

my_rand.counter = 0
RSA_key = RSA.generate(2048, randfunc=my_rand)

我已经对此进行了测试,它确实生成了确定性 RSA 密钥(至少只要您记得重置计数器)。但是,请注意,这并不是 100% 面向未来:如果 pycrypto RSA 密钥生成算法以某种方式更改,生成的密钥可能会更改。

无论哪种情况,您几乎肯定会希望使用慢速预处理您的密码按键拉伸 https://en.wikipedia.org/wiki/Key_stretchingKDF如PBKDF2 https://www.dlitz.net/software/pycrypto/api/current/Crypto.Protocol.KDF-module.html#PBKDF2,迭代次数尽可能高,您可以合理地容忍。这使得通过暴力猜测密码来破坏系统变得不那么容易。 (当然,您仍然需要使用强密码;如果您的密码是强密码,那么再多的密钥延伸也无济于事)abc123.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 中从密码生成 RSA 密钥 的相关文章

随机推荐

  • 创建 GGPLOT 直方图

    我有以下函数 n 掷 k 个骰子 其中结果是 k 掷骰子的总和 rolldie function n k Your code here die sample 1 6 size k replace TRUE replicate n sum s
  • ASP.NET MVC 浏览器链接是否不适用于 https (SSL) url?

    我正在尝试 ASP NET MVC 5 的 Browserlink 功能 对于非 SSL 页面来说一切都很好 但是 如果我导航到 SSL 页面 带有 https url 我会在浏览器链接仪表板中看到 0 个连接 那么 浏览器链接是否仅适用于
  • 使 Windows 快捷方式相对于文件夹所在位置启动?

    我有一个使用此文件结构的游戏 GAME FOLDER gt data gt data gt run bat 我想设置一个快捷方式run bat在游戏文件夹中 但如果我移动它 或者其他人安装它 它将无法工作 因为目标是错误的 有没有办法使目标
  • 如何将弹出框放置在文本的突出显示部分上?

    假设有文本正文的场景 而且 在突出显示其中的单词时 我希望显示一个弹出窗口 其中工具提示位于突出显示的单词处 Kind of like how mac shows definitions of words like below 这是一个 A
  • Pandas:将多行数据添加到单行的额外列中

    我有一个像这样的熊猫数据框 id value 1 25 2 40 3 30 理想情况下我想将其转换为 id value value 2 value 3 1 25 40 30 2 40 25 30 3 30 25 40 上述对话背后的逻辑是添
  • Python - 确定 3 个范围的重叠

    我有一个问题 关于如何在不使用任何现有库的情况下确定 Python 中三个范围的重叠 例如 如果我有三个范围 10 20 15 25 18 30 我应该如何找到它们之间的重叠 我的答案应该是 18 19 20 任何帮助将非常感激 谢谢 重叠
  • Paypal 快速结账错误 订单总额缺失。错误10400

    我有问题 我正在尝试将多个商品发送到 Paypal 但它显示 订单总数丢失 10400 错误 版本 76 0我正在贝宝沙箱上测试我的请求 AMT 106 72 RETURNURL http 3A 2F mydomainname com 2F
  • 两个不同区域内的实验数据拟合

    我正在拟合一组实验数据 sample https docs google com spreadsheets d 1JOw7bDwWWXSkR uU2aELrxx33bdqfR1nVci w1VFUOw edit usp sharing 在两
  • 比较Python中的大量字典列表

    我从来没有想过我会遇到 python 的速度问题 但我确实遇到了 我正在尝试根据字典值来比较非常大的字典列表 我比较两个列表 第一个列表如下 biglist1 transaction somevalue id somevalue date
  • 如何使用 ObservableCollection 源实现 XAML 单选按钮控件?

    我有以下内容ComboBoxXAML 中的元素
  • 使用 Readiness Probe 和 RollBack 策略的 Kubernetes 0 停机时间不起作用

    我已经在 Kubernetes 上设置了一个 Node 应用程序 我正在运行单个副本 并且希望在更新映像时停机时间为 0 我使用更新我的 Podset Image在 Kubernetes 上 set image deployment dev
  • Payola 问题:nil:NilClass 的未定义方法“amount”

    我刚刚学习如何使用 Payola 为我的 RoR 5 1 5 测试应用程序创建订阅 我正在按照 wiki 上的说明进行操作 我已经设置了从 Wiki 上的示例中获取的示例表单 并将其直接放入 app views subscriptions
  • 从 RStudio 访问命令行 (cmd)

    在我在 R 下的工作中 我需要调用另一个软件 ANSYS 为此 我正在 R 下寻找一个允许访问命令行窗口 cmd 的命令 例如 在 matlab 下 字符 允许执行此操作 谢谢 您可以使用system system2 or shell在 W
  • IBOutlet 声明?

    我已经看到下面的代码以 3 种不同的方式编写 关于 IBOutlet 这有关系吗 我想说将 IBOutlet 添加到声明和 property 中会更简洁 只是财产 class SwitchViewController interface i
  • 关于对象比较

    我有一个 java 类 Rec 我有两个实例 Rec1 和 Rec2 我想检查 Rec1 和 Rec2 的值是否相等 如果我这样做 Rec1 equals Rec2 是正确的做法吗 class Rec private BigDecimal
  • 如何从 URL 参数获取 unicode 字符?

    我需要使用 GET 请求通过 JavaScript 客户端将 JSON 发送到我的服务器 因此我开始回显响应以确保翻译过程中不会丢失任何内容 普通文本似乎没有问题 但是一旦我包含任何类型的 Unicode 字符 例如 该字符就会以某种方式编
  • JavaScript:回调函数参数与其他变量同名?

    var str internet performAction function str console log str 私有变量有问题吗str并且还有一个带有同名参数的回调函数 Thanks 这只是一个标准范围的情况 它是作为参数传递给另一
  • Android 机器未联网

    当我的应用程序连接到 WiFi 网络时 我在运行网络服务时遇到问题 我收到以下异常 java net SocketException socket failed ENONET Machine is not on the network 在下
  • 是否可以在不使用图像映射软件的情况下获得图像映射的坐标?

    我正在学习 html css 令我困惑的一件事是图像映射的想法 我该如何获取图像一部分的坐标并将其插入我的区域标签而不使用像 gimp 这样的图像映射软件 使用 gimp 的图像映射工具确实很有用 但我担心将来我需要知道如何在没有 gimp
  • 在 python 中从密码生成 RSA 密钥

    我希望能够生成并再生相同的 RSA 密钥password 和盐 单独在python 目前我正在使用 pycrypto 进行此操作 但是 它似乎并不能单独从密码生成相同的密钥 原因似乎是当 pycrypto 生成 RSA 密钥时 它在内部使用