- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为 Unix 用 C++ 编写我自己的 ASE/RSA 加密程序。我已经浏览了大约一个星期的文献,我已经开始考虑这一切,但我仍然有一些紧迫的问题:
1) 根据我的理解,最基本形式的 RSA key 是所使用的两个素数 (R) 和指数的乘积的组合。对我来说很明显,以明文形式存储 key 将完全违背加密任何东西的目的。因此,我可以以什么形式存储我生成的公钥和私钥?向用户询问密码并使用 ASCII 表对 key 的各个数字进行一些“简单”移位/替换?或者还有其他一些我没有遇到过的标准吗?此外,当生成 key 时,R 和相应的指数是否只是按顺序存储?即##primeproduct####exponent##?在这种情况下,解密算法如何将 key 解析为两个单独的值?
2)鉴于我已决定使用 65537 作为所有加密的公共(public)指数,我将如何以编程方式生成私有(private)指数?我有方程 P*Q = 1mod(M),其中 P 和 Q 以及指数和 M 是 Euler 的 Totient 函数的结果。这是否只是生成随机数并测试它们与公共(public)指数的相对素数的问题,直到您支付污垢?我知道你不能简单地从 1 开始并递增直到找到这样一个数字,因为任何人都可以简单地做同样的事情并自己得到你的私有(private)指数。
3)在生成字符等价集的时候,我明白这个集合中使用的数字不能小于P*Q并且相对质数。同样,这是测试数字与 P*Q 的相对素性的问题。测试相对素性的速度是否与您正在处理的数字的大小无关?还是需要特殊的算法?
提前感谢任何花时间阅读和回答的人,干杯!
最佳答案
有一些用于存储/交换 RSA key 的标准格式,例如 RFC 3447 .不管是好是坏,大多数(无论如何)都使用 ASN.1 编码,这增加了比大多数人喜欢的更多的复杂性,所有这些都是单独的。少数使用 Base64 编码,这更容易实现。
就什么构成 key 而言:就其最基本的形式而言,您是正确的;公钥包括模数(通常称为 n
)和指数(通常称为 e
)。
要计算 key 对,您需要从两个大素数开始,通常称为 p
和 q
.您计算模数 n
如 p * q
.您还计算了一个数字(通常称为 r
),即 (p-1) * (q-1)
.e
然后是一个或多或少随机选择的数字,它是相对于 r
的质数.警告:您不想要 e
虽然非常小 - log(e) >= log(n)/4 作为最低限度。
然后计算 d
(私有(private)解密 key )作为满足关系的数字:
d * e = 1 (mod r)
d
也非常小,所以如果结果非常小,您可能想尝试
e
的另一个值。 ,并计算一个新的
d
匹配。
e
和
d
.您可以先找到一些与 1 mod r 全等的数字 K,然后将其分解。将质因数放在一起得到大小大致相等的两个因数,并将它们用作
e
和
d
.
d
去:你需要
r
计算这个,并知道
r
靠知道
p
和
q
.这正是分解 RSA 的原因/地点/方式。如果您考虑
n
,那么你就知道
p
和
q
.从它们中,您可以找到
r
,来自
r
你可以计算
d
匹配一个已知的
e
.
p = 9999991
q = 11999989
n
和
r
:
n = 119999782000099
r = 119999760000120
e
否则计算
K
,然后将其分解为
e
和
d
.目前,我们将采用您的建议 e=65537(因为 65537 是素数,它的唯一可能性和
r
不是相对素数是如果
r
是 65537 的精确倍数,我们可以验证不是很容易的情况)。
d
.我们可以使用 Euclid 算法的“扩展”版本(如您所提到的)Euler's Totient、Gauss' 方法或其他许多方法中的任何一个来相当容易地(尽管不一定非常快)做到这一点。
template <class num>
num gcd(num a, num b) {
num r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
template <class num>
num find_inverse(num a, num p) {
num g, z;
if (gcd(a, p) > 1) return 0;
z = 1;
while (a > 1) {
z += p;
if ((g=gcd(a, z))> 1) {
a /= g;
z /= g;
}
}
return z;
}
e
和
n
上面给出,加密为:
74603288122996
49544151279887
83011912841578
96347106356362
20256165166509
66272049143842
49544151279887
22863535059597
83011912841578
49544151279887
96446347654908
20256165166509
87232607087245
49544151279887
68304272579690
68304272579690
87665372487589
26633960965444
49544151279887
15733234551614
d
上面给出,解密回原始。进行加密/解密(使用硬编码 key 和模数)的代码如下所示:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>
typedef unsigned long long num;
const num e_key = 65537;
const num d_key = 38110914516113;
const num n = 119999782000099;
template <class T>
T mul_mod(T a, T b, T m) {
if (m == 0) return a * b;
T r = T();
while (a > 0) {
if (a & 1)
if ((r += b) > m) r %= m;
a >>= 1;
if ((b <<= 1) > m) b %= m;
}
return r;
}
template <class T>
T pow_mod(T a, T n, T m) {
T r = 1;
while (n > 0) {
if (n & 1)
r = mul_mod(r, a, m);
a = mul_mod(a, a, m);
n >>= 1;
}
return r;
}
int main() {
std::string msg = "Very Secret Message!";
std::vector<num> encrypted;
std::cout << "Original message: " << msg << '\n';
std::transform(msg.begin(), msg.end(),
std::back_inserter(encrypted),
[&](num val) { return pow_mod(val, e_key, n); });
std::cout << "Encrypted message:\n";
std::copy(encrypted.begin(), encrypted.end(), std::ostream_iterator<num>(std::cout, "\n"));
std::cout << "\n";
std::cout << "Decrypted message: ";
std::transform(encrypted.begin(), encrypted.end(),
std::ostream_iterator<char>(std::cout, ""),
[](num val) { return pow_mod(val, d_key, n); });
std::cout << "\n";
}
e
的加密形式。 (这也发生在消息中的其他几个地方)。
e
是英文中最常见的字母,所以我们可以(正确)猜测加密数据中最常见的词代表
e
(各种语言中字母的相对频率是众所周知的)。更糟糕的是,我们还可以查看诸如成对和三联字母之类的东西来改进攻击。例如,如果我们在加密数据中连续两次看到同一个单词,我们就知道我们看到的是一个双字母,它只能是普通英文文本中的几个字母。底线:尽管 RSA 本身可以非常强大,但上面显示的使用方式绝对不是。
关于c++ - 关于RSA加密的各种问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111827/
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!