我使用RSA加密使用openSSL加密数据,效果很好.我对RSA的理解是,使用相同的公钥加密相同的数据总会给你相同的结果(如此处或此处所述).
但是,使用openssl每次重复加密时都会得到不同的结果.例如:
? ~ echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin | shasum
11b6e058273df1ebe0be5e0596e07a6c51724ca0 -
? ~ echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin | shasum
05cb82595f7429ef196189f4e781088597d90eee -
Run Code Online (Sandbox Code Playgroud)
那么为什么输出不是唯一的呢?是因为我得到RSA加密错误还是因为openssl做了一些额外的魔术?
实际上我正在尝试设计一个只存储RSA加密数据的数据库.我想对加密信息的哈希值进行搜索,如果加密过程本身不是唯一的,这是不可能的.
我想知道RSA签名的长度是多少?是否总是与RSA密钥大小相同,如果密钥大小为1024,则RSA签名为128字节,如果密钥大小为512位,则RSA签名为64字节?什么是RSA模数?那么RSA-sha1是什么意思?任何指针都非常感激.
我有一个System.Security.Cryptography.RSACryptoServiceProvider的实例,我需要将它的密钥导出到PEM字符串 - 如下所示:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDUNPB6Lvx+tlP5QhSikADl71AjZf9KN31qrDpXNDNHEI0OTVJ1
OaP2l56bSKNo8trFne1NK/B4JzCuNP8x6oGCAG+7bFgkbTMzV2PCoDCRjNH957Q4
Gxgx1VoS6PjD3OigZnx5b9Hebbp3OrTuqNZaK/oLPGr5swxHILFVeHKupQIDAQAB
AoGAQk3MOZEGyZy0fjQ8eFKgRTfSBU1wR8Mwx6zKicbAotq0CBz2v7Pj3D+higlX
LYp7+rUOmUc6WoB8QGJEvlb0YZVxUg1yDLMWYPE7ddsHsOkBIs7zIyS6cqhn0yZD
VTRFjVST/EduvpUOL5hbyLSwuq+rbv0iPwGW5hkCHNEhx2ECQQDfLS5549wjiFXF
gcio8g715eMT+20we3YmgMJDcviMGwN/mArvnBgBQsFtCTsMoOxm68SfIrBYlKYy
BsFxn+19AkEA82q83pmcbGJRJ3ZMC/Pv+/+/XNFOvMkfT9qbuA6Lv69Z1yk7I1ie
FTH6tOmPUu4WsIOFtDuYbfV2pvpqx7GuSQJAK3SnvRIyNjUAxoF76fGgGh9WNPjb
DPqtSdf+e5Wycc18w+Z+EqPpRK2T7kBC4DWhcnTsBzSA8+6V4d3Q4ugKHQJATRhw
a3xxm65kD8CbA2omh0UQQgCVFJwKy8rsaRZKUtLh/JC1h1No9kOXKTeUSmrYSt3N
OjFp7OHCy84ihc8T6QJBANe+9xkN9hJYNK1pL1kSwXNuebzcgk3AMwHh7ThvjLgO
jruxbM2NyMM5tl9NZCgh1vKc2v5VaonqM1NBQPDeTTw=
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
但根据MSDN文档,没有这样的选项,只有某种XML导出.我不能使用任何第三方库,如BouncyCastle.有没有办法生成这个字符串?
通过传递.pem文件使用OpenSSL :: PKey :: RSA模块构建公钥时,响应的原因是什么:
OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key:: nested asn1 error
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `initialize'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `new'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `open'
from (irb):1
Run Code Online (Sandbox Code Playgroud)
这是来源:
cert = File.join(rails_root, 'config', 'apns', 'sandbox-cert.pem')
APN_CONFIG = { :delivery => {
:host => 'gateway.sandbox.push.apple.com',
:cert => cert,
:passphrase => "",
:port => 2195 },
:feedback => {
:host => 'feedback.sandbox.push.apple.com',
:port => 2196,
:passphrase => "",
:cert => cert} }
options = APN_CONFIG[:delivery].merge(options)
cert = File.read(options[:cert])
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, …Run Code Online (Sandbox Code Playgroud) 如果您正在为RSA密钥提供正确的密码,是否有办法在本地进行检查?
我最近无法将一些提交推送到github,因为推送提示输入密码然后验证失败.我验证了github id_rsa在我的~/.ssh目录中有正确的文件公钥,我确认我可以使用Github进行身份验证(如果ssh git@github.com它会告诉您已经过身份验证但是他们不提供shell访问权限),所以我知道问题所在在我的尽头,而不是Github的.
(我应该指出,此时我只是习惯git format-patch将我的提交作为文件,然后吹走我的工作存储库并从Github重新克隆,重新应用补丁git am,并毫不费力地推送,所以无论原始问题是什么,它是固定的.)
这让我想知道:我怎么知道远程主机的身份验证问题是我向我的私钥提供了错误的密码,还是远程主机没有识别我的密钥?有没有办法在本地使用私钥进行测试身份验证,而无需尝试连接到远程主机?
我一直在寻找一周左右的时间来实现我想到的方法.我已经看过很多关于所有这些不同方法的文章,但我仍然感到困惑,所以我希望有人可以传播他们对这些主题的知识,这样我就可以更轻松地创建我追捧的方法和在Android中实现它.
我的"追捧"方法:
显然你可以用四种方式去做:
由于我对安全性和Java整体都很陌生,所以我想知道是否有人能够最终对所有这些做出明确的解释.
以下是我尝试在4种不同的编程方法中实现我所追求的方法(如上所述)的方法.如果我不知道它是什么,因为我无法弄清楚各自的文件.请随时纠正我.
public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair keyPair = kpg.genKeyPair();
byte[] pri = keyPair.getPrivate().getEncoded();
byte[] pub = keyPair.getPublic().getEncoded();
return pub;
}
Run Code Online (Sandbox Code Playgroud)
public byte[] returnPublicKeyInBytes() throws NoSuchAlgorithmException {
RSAKeyPairGenerator r = new RSAKeyPairGenerator();
r.init(new KeyGenerationParameters(new SecureRandom(),4096));
AsymmetricCipherKeyPair keys = r.generateKeyPair();
CipherParameters pri = keys.getPrivate();
CipherParameters pub = keys.getPublic();
byte[] pubbyte = pub.toString().getBytes();
return pubbyte; //NOT WORKING …Run Code Online (Sandbox Code Playgroud) 我想用JavaScript加密,用PHP解密,使用公钥加密.我一直在努力寻找可以实现这一目标的库,但我遇到了问题.
我目前正在查看openpgpjs,但我需要在所有浏览器中提供支持,甚至测试页面也只在列出的受支持浏览器(Google Chrome)上出现错误.
关于最终目标的说明:
TCP连接已受SSL保护.这一保护层的主要目的是防止有意或无意的网络服务器日志记录,崩溃转储等.
在PHP端,将生成临时私钥(它将在短时间后过期).调用者(在Javascript中)负责在新的公钥到期时要求它.私钥到期的原因是为了防止记录加密数据解密,以防存储私钥的服务器稍后被泄露.
服务器受损的情况:有人获取除数据库服务器之外的所有计算机的备份(并且由于防火墙而无法访问数据库,即使他找到了用户和密码).由于加密记录数据的私钥不再存在,攻击者无法做到.
我们是否可以将多个公钥与一个私钥相关联以进行RSA公钥加密?
rsa ×10
cryptography ×4
php ×2
security ×2
android ×1
bouncycastle ×1
c# ×1
c++ ×1
certificate ×1
encryption ×1
java ×1
javascript ×1
openssl ×1
pem ×1
pgp ×1
public-key ×1
sha1 ×1
ssh ×1
ssh-keys ×1
ssl ×1
terminal ×1
unix ×1
winapi ×1