标签: rsa

RSA 加密的结果是否保证是随机的

我使用 RSACryptoServiceProvider 来加密一些小数据块。对于我正在研究的解决方案,重要的是如果相同的源数据使用相同的公钥加密两次,结果(加密的数据块)是不同的。

我用一个例子检查了这个,它像我希望的那样工作。我现在的问题是,如果这种行为是设计使然并有保证的,或者我是否必须向源数据添加一些随机部分以保证加密后无法再匹配具有相同数据的数据块。

这是示例:

byte[] data=new byte[]{1,7,8,3,4,5};
RSACryptoServiceProvider encrypter = cert.PublicKey.Key as RSACryptoServiceProvider;
byte[] encryptedData = encrypter.Encrypt(data,true);

// encryptedData has always other values in, although the source data is always
// 1,7,8,3,4,5 and the certificate is always the same (loaded from disk)
Run Code Online (Sandbox Code Playgroud)

具体问题是针对 .net 的,但如果是设计使然,也许可以为所有 RSA 实现提供一般性的答案?

cryptography rsa .net-security

1
推荐指数
1
解决办法
1529
查看次数

带有二进制文件的 NodeJS exec 进程

我正在尝试编写一个函数,它将使用本机 openssl 为我做一些 RSA 繁重的工作,而不是使用 js RSA 库。目标是

  1. 从文件中读取二进制数据
  2. 在node进程中做一些处理,使用JS,得到一个包含二进制数据的Buffer
  3. 将缓冲区写入 exec 命令的 stdin 流
  4. RSA 加密/解密数据并将其写入标准输出流
  5. 将输入数据取回 JS-process 中的 Buffer 进行进一步处理

Node 中的子进程模块有一个 exec 命令,但我看不到如何将输入通过管道传输到进程并将其通过管道返回到我的进程。基本上我想执行以下类型的命令,但不必依赖于将内容写入文件(没有检查 openssl 的确切语法)

cat the_binary_file.data | openssl -encrypt -inkey key_file.pem -certin > the_output_stream
Run Code Online (Sandbox Code Playgroud)

我可以通过编写一个临时文件来做到这一点,但如果可能的话,我想避免它。生成子进程允许我访问 stdin/out 但还没有为 exec 找到这个功能。

有没有一种干净的方法可以按照我在这里起草的方式来做到这一点?是否有一些替代方法可以为此使用 openssl,例如,openssl lib 的一些本机绑定,这将允许我在不依赖命令行的情况下执行此操作?

javascript rsa exec node.js

1
推荐指数
1
解决办法
3193
查看次数

AES 的衍生 IV

如果每次在各方之间进行交易时都会生成一个新的随机 AES 密钥。IV是否从密钥派生有关系吗?

例如:Bob 向 Alice 发送一条 AES-CBC 加密消息。Bob 为此创建了一个随机的 256 位密钥。现在假设 Bob 使用 sha256(key) 的前 128 位来获得用于加密的 IV。

Bob 使用 Alice 的公钥通过 RSA 加密来保护密钥。现在 Alice 使用她的 RSA 私钥解密密钥。然后 Alice 使用 sha256(key) 的前 128 位获得 IV 用于解密。

Alice 和 Bob 继续使用相同的程序交谈,但每次发送消息时都会生成一个新的随机密钥。

现在假设 Eve 可以读取 Bob 和 Alice 的 AES 和 RSA 密文。Eve 也知道 Bob 和 Alice 正在从密钥和使用的方法中推导出 IV。那仍然无助于 Eve 破解消息?

encryption rsa aes

1
推荐指数
1
解决办法
1017
查看次数

使用 RSA 的音频加密

当我运行下面的代码时,解密的长度与原始长度不同。所以无法读取音频。

我收到此错误:javax.sound.sampled.UnsupportedAudioFileException:无法从输入流获取音频输入流

at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1119)
at MainClass.main(MainClass.java:119)
Run Code Online (Sandbox Code Playgroud)

我的代码在这里:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class MainClass {
public static final int SIZE = 1024;

private BigInteger p, q, n, totient, e, d;
private Random rnd = new Random();

public MainClass() {

    p = new BigInteger(1024, 10, new Random());
    do {
        q = new BigInteger(1024, 10, new Random());
    } while (p.equals(q));

    n = p.multiply(q);

    totient = (p.subtract(BigInteger.ONE)).multiply(q …
Run Code Online (Sandbox Code Playgroud)

java cryptography rsa

1
推荐指数
1
解决办法
1600
查看次数

你如何在C#中导入公钥?

我可以创建服务器和客户端的非对称密钥,然后导出它们并尝试交换它们。我的问题,我一直无法找到解决方案,是我想将服务器的公钥导入客户端程序。它以字节 [] 的形式出现,但我需要能够将其用作 RSAParameters 才能加密数据以发送到服务器。如何将 byte[] 转换为 RSAParameters 类型?

private void secureButton_Click(object sender, EventArgs e)
        {
            clientRSA = new RSACryptoServiceProvider();
            byte[] clientPublicKey = clientRSA.ExportCspBlob(false);

            stm.Write(clientPublicKey, 0, clientPublicKey.Length);
            stm.Read(serverPublicKey, 0, serverPublicKey.Length);
        }
Run Code Online (Sandbox Code Playgroud)

我知道这不是一种“安全”的方法,因为它容易受到 MITM 的影响,但我正面临学校的最后期限,这是我需要克服的砖墙,才能继续进行下去。

任何帮助,将不胜感激。提前致谢。

c# client-server rsa

1
推荐指数
1
解决办法
5828
查看次数

RSA 私钥切换 prime1/prime2 和 exponent1/exponent2

我的 Firefox/Thunderbird 版本高于 31 时有证书问题。由于未知原因,导入失败。我可以在旧版本的 F/T 中导入证书并再次导出,之后它在当前版本中运行良好。我发现证书之间的唯一区别是私钥属性。证书采用 pkcs12 格式。

首先我提取了私钥

openssl pkcs12 -in certificate.p12 -nocerts -out privatekey.pem
Run Code Online (Sandbox Code Playgroud)

然后我打印出详细信息

openssl rsa -in privatekey.pem -text -noout
Run Code Online (Sandbox Code Playgroud)

我从我的旧证书和导出的证书中得到完全相同的输出,除了 prime1、prime2 和 exponent1、exponent2 被切换并且系数不同。

有没有简单的方法可以用命令解决问题?也许是一个 openssl 命令?

附加信息:
来自工作导出私钥的 prime1 和 prime2。在旧的私钥中,它的输出完全相同,但 prime1 和 prime2 相同,反之亦然。

prime1:
    00:f6:63:95:7c:1a:96:4f:33:c7:dd:3f:a4:dc:7d:
    00:5f:e3:0e:93:d7:2f:88:d1:44:f3:2b:75:38:00:
    18:bb:19:ba:af:ac:20:34:93:d0:42:fb:d7:73:66:
    f6:cc:d8:10:b1:31:ea:f8:79:5d:f5:08:56:2f:2d:
    d8:31:e6:6e:62:92:89:eb:1e:44:31:ed:92:0a:a1:
    02:ef:f5:f7:7c:2c:a0:26:60:5b:95:3a:a4:44:fa:
    dc:ce:99:88:88:d7:f2:25:1d:48:6f:c6:b4:72:d0:
    b0:50:59:18:e8:81:c7:13:45:e2:04:38:8f:d7:53:
    50:0a:7a:44:8f:21:e9:d4:bd

prime2:
    00:96:4a:84:35:b9:bd:0c:f4:00:e1:d4:2e:f7:49:
    ce:a5:0f:3d:90:83:ad:5b:7b:e0:06:a4:a1:6a:bd:
    2e:7c:3c:b8:1c:f1:b9:45:fc:41:00:ec:70:5b:ba:
    00:21:62:df:54:07:9a:b1:09:93:89:27:f8:29:55:
    bf:90:81:ea:07:ef:0f:dd:ca:11:da:d6:aa:e7:de:
    16:6c:68:52:fe:51:e6:20:46:3c:97:af:e2:a6:fd:
    ef:bb:e3:08:9d:13:18:88:51:73:ae:81:15:7c:1b:
    86:52:d5:16:cc:86:66:8e:b8:48:b9:6c:14:27:10:
    82:8e:04:e6:ea:25:af:20:53
Run Code Online (Sandbox Code Playgroud)

openssl rsa certificate private-key

1
推荐指数
1
解决办法
3784
查看次数

从 Cryptico.js 中提取 RSA 私钥

我相信这是一个非常基本的问题,但我正在开始研究 JavaScript 和 RSA,所以我有点迷茫。我刚刚下载了库 Cryptico,它为我提供了一个易于使用的 RSA 密钥生成/加密/解密。生成的 RSA 密钥的公共部分,只需使用以下命令即可轻松提取:

publicKeyString(RsaKey)

这是:

my.publicKeyString = function(rsakey) 
{
    pubkey = my.b16to64(rsakey.n.toString(16));
    return pubkey; 
}
Run Code Online (Sandbox Code Playgroud)

在函数中生成密钥时定义了 rsakey.n:

function RSAGenerate(B, E)
{
    var rng = new SeededRandom();
    var qs = B >> 1;
    this.e = parseInt(E, 16);
    var ee = new BigInteger(E, 16);
    for (;;)
    {
        for (;;)
        {
            this.p = new BigInteger(B - qs, 1, rng);
            if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
        }
        for (;;)
        {
            this.q = new BigInteger(qs, 1, rng);
            if …
Run Code Online (Sandbox Code Playgroud)

javascript rsa cryptico

1
推荐指数
1
解决办法
2224
查看次数

期望脚本来处理 RSA 指纹密钥

我试图让我的期望脚本更加健壮,并能够处理更多情况以更加自动化。目前我的脚本工作正常,但是,有时我会被要求将 RSA 密钥添加到 known_hosts,我希望它一直默认为 yes。我的服务器并不总是要求提供密钥,一旦添加,一段时间后它不会询问,直到您删除密钥或切换网关。在线查看后,我尝试在我的工作代码中添加此(注释代码),并在添加后说,如果已经添加了 RSA 密钥,它会在密码输入屏幕上停止

所以我的问题是,有没有办法处理这种情况,假设已经添加了 RSA,它只会跳到密码行?

[user@gateway my_direcotry]$ cat loadItTest
#!/usr/bin/expect -f

set timeout 600
set user root
set host 1.1.1.1
set pass pass


spawn ssh $user@$host

#expect {
#    -re "RSA key fingerprint" {send "yes\r"}
#}

expect "assword:"
send "$pass\r"
expect "#"
Run Code Online (Sandbox Code Playgroud)

示例输出:

[root@gateway my_direcotry]# loadItTest
spawn ssh root@1.1.1.1
root@1.1.1.1's password:
Run Code Online (Sandbox Code Playgroud)

linux rsa expect

1
推荐指数
1
解决办法
3090
查看次数

RSA 加密:否定 d 解决方案似乎太大而无法使用

我已经实现了一个主要功能的 RSA 加密。它随机生成 2048 位素数pq ( n = pq ) 并且大多数时候我得到的值d与预期的一样相对较小。值 d 用于加密M^d mod n。

但是,有时我得到的d值是负数,这在 RSA 中通常是不受欢迎的。经过一些研究,我发现一个常见的解决方案是在这种情况下简单地添加phi (phi = (p-1)(q-1)) 。

d = d % phi;
if(d < 0)
    d += phi;
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我最终得到的dn一样大(超过 2048 位)。这似乎太大而无用。是否有我遗漏的东西,或者d的值实际上可以接受?

encryption cryptography rsa

1
推荐指数
1
解决办法
1717
查看次数

使用 java 安全提供程序分离摘要和签名

由于一些实现细节,我需要拆分散列和签名生成。我尝试使用“NONEwithRSA”签名算法来实现这一点。

这是一个基本的工作示例:

public void rsaSignatureIntegrityTest() {
    KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
    gen.initialize(2048, new SecureRandom());
    KeyPair pair = gen.generateKeyPair();

    byte[] digest = MessageDigest.getInstance("SHA-256").digest(MESSAGE);
    Signature signer = Signature.getInstance("NONEwithRSA");
    signer.initSign(pair.getPrivate());
    signer.update(digest);
    byte[] signed = signer.sign();

    Signature verifier = Signature.getInstance("SHA256withRSA");
    verifier.initVerify(pair.getPublic());
    verifier.update(MESSAGE);
    verifier.verify(signed);
}
Run Code Online (Sandbox Code Playgroud)

运行这个,该verifier.verify()方法抛出一个签名异常:

java.security.SignatureException: Signature encoding error
    at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204)
    at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
    at java.security.Signature.verify(Signature.java:652)
    at testing.rsaSignatureIntegrityTest(testing.java:38)
    ...
Caused by: java.io.IOException: Sequence tag error
    at sun.security.util.DerInputStream.getSequence(DerInputStream.java:297)
    at sun.security.rsa.RSASignature.decodeSignature(RSASignature.java:229)
    at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:195)
    ... 26 more
Run Code Online (Sandbox Code Playgroud)

验证者对象似乎期望某种 DER 编码结构,它不是由签名者对象产生的。

有关如何使其工作的任何建议?

java hash cryptography rsa digital-signature

1
推荐指数
1
解决办法
1598
查看次数