这是 RSA KEY 生成操作的一个步骤。所以很多文章只是说 ed \xe2\x89\xa1 1 (mod \xcf\x86(n)) 等于 ed - 1 = k\xcf\x86(n)。
\n\n我不明白他们如何将 (mod \xcf\x86(n)) 更改为 k\xcf\x86(n) ?
\n我在 OpenSSL 中使用选项找到了对称例程的加盐技术-salt。但我找不到非对称 RSA 算法的 salt 选项。
我正在开发一个使用应用内购买的 Android 应用程序。用户购买后,Play 商店会以 JSON 字符串形式发送响应。该响应看起来像这样(当然,没有编辑敏感信息):
{
"type":"android-playstore",
"id":"<My Application ID>",
"purchaseToken":"<The Purchase Token>",
"receipt":{
"orderId":"<The Order ID>",
"packageName":"com.example.skeleton",
"productId":"credit.basic",
"purchaseTime":1436546971245,
"purchaseState":0,
"purchaseToken":"<The Purchase Token>"
},
"signature":"Im27prAnxYwdRoug..."
}
Run Code Online (Sandbox Code Playgroud)
Google Play 结算安全文档指出
Google Play 对包含采购订单响应数据的 JSON 字符串进行签名。Google Play 使用开发者控制台中与您的应用程序关联的私钥来创建此签名。
我不太擅长加密,但我的理解是 RSA 签名的工作原理是获取要签名的字符串的 SHA1 哈希值,然后使用私钥对其进行加密以生成签名。当想要验证字符串的来源时,使用公钥对签名进行解密(证明它是使用私钥加密的),并将解密的哈希值与消息的哈希值进行比较,看看它们是否匹配。
然而,这里有一个问题。签名本身包含在发送到我的应用程序的 JSON 字符串中。您无法在签名后更改字符串,因此当 Google 说他们“对包含响应数据的 JSON 字符串进行签名”时,它们并不意味着我收到的整个 JSON 字符串。他们必须签署字符串的某些部分并将签名附加到该部分。我的问题是我无法弄清楚字符串的哪一部分已签名。使用此问题中描述的签名验证实现,我尝试验证删除了签名属性的 JSON 字符串,不带括号,仅包含收据部分等。为了更好地衡量,我尝试了整个字符串,包括签名。我似乎找不到这个 JSON 字符串中可以用我的公钥进行加密验证的任何部分。我是否应该使用字符串的某些部分,或者我只是不明白签名是如何工作的?
该代码应该建立一个监听来自投票网站的连接的服务。它是一个监听来自外部(客户端)连接的服务器。当客户端连接时,客户端等待发送版本号。一旦我的服务器/侦听器发送版本号,客户端就会使用我提供的公钥进行 RSA 2048 位加密的 256 字节块进行响应。然后必须对该块进行解码,(稍后)我将读取内容。我陷入无法解密的困境:
我明白了:
开始连接...
来自 ('50.28.6.244', 35338) 的连接
正在发送版本号...
接收加密块
回溯(最近一次调用最后一次):
文件“voteListener.py”,第 97 行,位于
主要(私钥)
文件“voteListener.py”,第 49 行,在 Main 中
解码文件=decode_msg(数据,私钥)
文件“voteListener.py”,第 58 行,decode_msg
密文 = cipher.decrypt(msg)
文件“C:\Python27\lib\site-packages\Crypto\Cipher\PKCS1_OAEP.py”,第 227 行,解密
引发 ValueError("解密不正确。")
ValueError:解密不正确。
C:\Users\STEXAS\Desktop\vote>暂停
按任意键继续 。。。
我的代码:
import socket
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from os import path
def Main(privatekey):
host = "0.0.0.0"
port = 8192
version = "VOTIFIER 1.9"
print("starting connection...")
while True:
s = socket.socket()
s.bind((host, port))
s.listen(1)
c, addr = …Run Code Online (Sandbox Code Playgroud) 我使用以下命令创建了 RSA 私钥:
openssl genrsa -out keypair.pem 2048
Run Code Online (Sandbox Code Playgroud)
我必须在该项目中使用 DER 编码的密钥 (PKCS#1),因此我从这个 PEM 编码的私钥文件生成了两个 DER 文件 - 一个包含私钥,另一个包含公钥。
openssl rsa -inform PEM -in keypair.pem -outform DER -pubout -out public.der
openssl rsa -inform PEM -in keypair.pem -outform DER -out private.der
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我将这两个文件的内容加载到 char* 变量中。
以下均未按预期工作:
d2i_RSA_PUBKEY(NULL, &public_key_bytes, public_key_length);
d2i_RSAPublicKey(NULL, &public_key_bytes, public_key_length);
d2i_RSAPrivateKey(NULL, &private_key_bytes, private_key_length);
Run Code Online (Sandbox Code Playgroud)
我知道这一点,因为他们都回来了null。我还尝试了以下方法:
RSA * rsa = RSA_new();
d2i_RSA_PUBKEY(&rsa, &public_key_bytes, public_key_length);
RSA * rsa = RSA_new();
d2i_RSAPublicKey(&rsa, &public_key_bytes, public_key_length);
RSA * rsa = RSA_new();
d2i_RSAPrivateKey(&rsa, &private_key_bytes, private_key_length);
Run Code Online (Sandbox Code Playgroud)
皆归 …
我一直在 python 中尝试 RSA 加密(cryptography.hazmat.primitives.ametry)。我有以下设置:一端是具有公钥的客户端,将加密数据发送回保存私钥的服务器。现在我已经可以进行单向加密,但我想知道您将如何(或者是否应该)安全地解密消息客户端。我想过只加密私钥并存储它,但密码会出现在代码中并使密钥暴露。有没有办法通过密钥交换安全地实现这一点?或者——最可能的选择——这是对协议的滥用吗?
编辑:想要澄清的是,这里可能的问题是,以这种方式使用 RSA 可能会暴露文件系统上或服务器和客户端之间的私钥。
对于加密、解密、签名和验证签名,我使用此处的代码DotnetCore.RSA
在我开始处理大文本之前,它一直运行良好。
通过 RSA 加密不适用于大文本。大,超过 245 个字节,具有 2048 个 RSA 密钥
我在尝试加密大文本时遇到异常:
异常消息:Interop.Crypto.OpenSslCryptographicException: 'error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size'
加密功能:
public string Encrypt(string text) {
if (_publicKeyRsaProvider == null) {
throw new Exception("_publicKeyRsaProvider is null");
}
return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1));
}
Run Code Online (Sandbox Code Playgroud)
编写 DotnetCore.RSA 的开发人员建议将长文本分成许多小文本,分别加密并连接它们
有什么建议吗,正常还是不正常?也许建议一些用于 .net Core 的 RSA 加密库
我使用 python 生成了 RSA 密钥对,我想在 javascript 中导入它。我成功导入了公钥,但在私钥导入方面遇到了困难。
Python :
from Cryptodome.PublicKey import RSA
key = RSA.generate(1024)
private_key = key.export_key().decode("ascii")
public_key = key.publickey().export_key().decode("ascii")
Run Code Online (Sandbox Code Playgroud)
JavaScript:
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
async function importRsaPublicKey(pem) {
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PUBLIC KEY-----";
const pemFooter …Run Code Online (Sandbox Code Playgroud) C# BouncyCastle 包含一个名为 Org.BouncyCastle.Utilities.IO.Pem.PemReader 的类,该类似乎采用 PEM 格式的 RSA 公钥文件。我查看了这个链接:how can I conversion pem public key to rsa public key with bouncycastle in c#?
但它似乎在 PemReader 上使用了不存在的方法,称为 ReadObject。所以我改为编写以下代码。
var pemReader = new PemReader(File.OpenText(@"...rsa public key file path ..."));
var pemObject = pemReader.ReadPemObject();
var rsaPublicKeyBytes = pemObject.Content;
Run Code Online (Sandbox Code Playgroud)
一旦我获得 RSA 公共字节,我不知道如何进一步进行。我希望能够执行以下操作:
var rsaCipher = new RsaEngine();
var oaepEncoding = new OaepEncoding(rsaCipher, new Sha256Digest());
var publicKey = new RsaKeyParameters(...);
oaepEncoding.Init(true, publicKey);
var actualEncryptedBytes = oaepEncoding.ProcessBlock(plainBytes, 0, plainBytes.Length);
Run Code Online (Sandbox Code Playgroud)
我想我不确定如何使用 RSA 公共字节构造 RsaKeyParameters。有人能指出我正确的方向吗?或者我在这里完全走错路了?
我正在运行 NodeJS 8.12.0,并且必须在哈希上设置签名,而不需要重新哈希它,从而执行原始签名。或者,换句话说,用私钥对散列值进行加密。
const crypto = require('crypto');
// 4096 bits key.
let pk = "<BASE64 DER>";
let pub = "<BASE64 DER>";
// Transform them to PEM.
pk = `-----BEGIN PRIVATE KEY-----\n${pk.replace('\n', '')}\n-----END PRIVATE KEY-----\n`;
pub = `-----BEGIN PUBLIC KEY-----\n${pub.replace('\n', '')}\n-----END PUBLIC KEY-----\n`;
// Load the data to sign and set the signature.
const fingerprint = Buffer.from('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824','hex');
const signature = crypto.privateEncrypt({
key: pk,
padding: crypto.constants.RSA_PKCS1_PADDING
},
fingerprint
);
// Unfortunately, the server is not able to verify the signature...
console.log(signature.toString('hex'));
Run Code Online (Sandbox Code Playgroud)
因此,我使用私钥查看了消息哈希的原始加密,最终得到了某种 …
rsa ×10
.net-core ×2
c# ×2
cryptography ×2
encryption ×2
openssl ×2
algorithm ×1
android ×1
bouncycastle ×1
c ×1
cryptojs ×1
google-play ×1
javascript ×1
math ×1
node.js ×1
pycrypto ×1
python-2.7 ×1
python-3.x ×1
salt ×1
sign ×1
signature ×1