- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下 ElGamal 加密方案
const forge = require('node-forge');
const bigInt = require("big-integer");
// Generates private and public keys
function keyPairGeneration(p, q, g) {
var secretKey = bigInt.randBetween(2, q.minus(2));
var publicKey = g.modPow(secretKey, p);
const keys = {
secret: secretKey,
public: publicKey
}
return keys;
}
// Generates a proxy and a user key
function generateProxyKeys(secretKey) {
const firstKey = bigInt.randBetween(1, secretKey);
const secondKey = secretKey.minus(firstKey);
const keys = {
firstKey: firstKey,
secondKey: secondKey
}
return keys;
}
// Re-encrypts
function preEncrypt(p, q, g, m, publicKey) {
const k = bigInt.randBetween(1, q.minus(1));
const c1 = g.modPow(k, p);
// g^x = publicKey
// m.publicKey^k
const c2 = bigInt(m).multiply(publicKey.modPow(k, p)).mod(p);
const c = {
c1: c1,
c2: c2
}
return c;
}
function preDecrypt(p, c1, c2, key) {
// (mg^xr) / (g^rx1)
var decrypt = c2.multiply(c1.modPow(key, p).modInv(p)).mod(p);
return decrypt;
}
这对于数字来说效果很好。但是,我希望能够使用它来加密字符串(顺便说一句,它不是常规的 ElGamal,我认为区别与此上下文无关,但有关更多详细信息,请参阅 this question I asked )
我考虑过将字符串转换为整数,运行加密,然后在需要时转换回字符串。我找不到在 JS 中执行此操作的方法(这里发布了 this question 但代码不起作用)。有another similar question但它是在 Java 中,并且 JS 中的 BigInt 实现没有提供其中提到的方法。
是否有任何简单的方法可以将字符串转换为 BigInt?
最佳答案
非对称加密不应用于加密任意长度的消息,因为它比对称加密慢得多。因此,我们可以对实际消息使用对称加密,对加密消息的 key 使用非对称加密。
对于任意大小的消息基本上有两种方法:
如果质数 p
足够大,适合对称密码(例如 AES)的通用 key 大小,那么您可以简单地生成随机 AES key (128、192 或 256 位) )并使用 AES 派生方案(例如 AES-GCM)来加密您的消息。然后,您从 AES key 中解码出一个数字(使用 fromArray
),以用作类似 ElGamal 的加密方案中的 m
。这称为hybrid encryption .
无论素数p
有多大,您始终可以生成1
到范围内的随机
并使用它来生成非对称密文。之后,您可以将之前生成的 m
数>p-1m
编码为字节数组(使用 toString(16)
生成十六进制编码的字符串,然后简单地将其解析为十六进制进行哈希)并使用用于获取 AES key 的加密哈希函数(例如 SHA-256)。然后,您可以使用 AES key 通过 AES-GCM 等对称方案来加密消息。这称为key encapsulation .
剩下的主要问题是数据格式:如何序列化密文的非对称部分和对称部分的数据?您如何读回它们以总是区分它们?有很多可能的解决方案。
如果您要加密的消息的最大大小小于您使用的素数,则不需要上述两种方法。您只需获取消息的字节表示并将其转换为大整数。像这样的事情:
var arr = Array.prototype.slice.call(Buffer.from("some message"), 0);
var message = bigInt.fromArray(arr, 256);
这是一个big endian encoding .
只有当你的素数足够大时,这才有意义 should be for security .
关于node.js - 将 ElGamal 加密从加密数字转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617188/
对于提出这个问题的不礼貌,我提前表示歉意,但我已经被困了很长时间,我正在努力弄清楚下一步该怎么做。本质上,我正在尝试对某些数据执行 ElGamal 加密。我得到了一个临时 key 对的公共(publi
如何为 elgamal 签名方案找到生成器?大多数程序使用的值是好的生成器吗?还是有一种方法可以找到素数的生成器?如果是这样,如何?是否可以说质数至少有 1 个生成元? 最佳答案 使用 DSA 而不是
我已经基于 this 在 JavaScript 中实现了一个 ElGamal 方案(代码很糟糕,只是想快速测试一下)解释。 var forge = require('node-forge'); var
我正在使用 El Gamal 密码系统,我的目标是能够加密和解密长文本序列。 El Gamal 要求明文是一个整数。我使用字符串的 .getBytes() 方法将我的字符串转换为 byte[],然后从
嗨,我正在用 java 编写一个程序来测试 elgamal 加密的变体,但是我的问题不是加密/解密链本身,而是如何对给定的输入执行操作:文本文件。我有一个文本文件,其中包含一些单词(例如内容可以是:“
我有以下 ElGamal 加密方案 const forge = require('node-forge'); const bigInt = require("big-integer"); // Gen
我一直致力于加密字符串并将其显示为二维码(在对字符串进行 Base64 编码之后)。 我想使用PyCrypto中的ElGamal私钥-公钥加密模块进行加密,但问题是它没有导出功能将 key 保存到文本
我正在尝试使用 ElGamal 加密和解密文本文件以进行研究,但似乎无法使其正常工作。我有一组 1kb - 1mb 的文本文件,我使用 512 位作为我的 key 大小。我已经知道,就像 RSA 一样
我发现OpenSSL尚未实现ElGamal。但是,目前我需要使用OpenSSL来实现ElGamal。我只是想知道以前是否有人这样做过。这可能会帮助我减轻工作负担。如果没有,在 OpenSSL 中实现
我正在使用 Libgcrypt 和 Elgamal 来加密一个字节块,但我遇到了两个问题: 当我不使用填充并且我的字节块以零字节开始时,我在解密过程中丢失了第一个字节; 如果我使用填充,加密效果很好,
(这纯粹是出于学术目的) 我已经使用充气城堡实现了 RSA 和 ElGamal,但我不确定如何实现 EC ElGamal。充气城堡规范中的第 4.4 节说:“org.bouncycaSTLe.cryp
长话短说:我需要使用 ElGamal 加密来对编码数字执行乘法。 我目前正在将 Kotlin 与 OpenJDK 1.8 一起使用,并找到了一个名为 Bouncy CaSTLe 的 JCE 不错的提供
我创建了一个小程序来使用 Bouncy CaSTLe 1.47 API 生成 DSA/El Gamal PGP key 环。 key 生成非常顺利,没有错误。我使用装甲输出将私钥和公钥导出到一个文件中
要在 java 代码中使用 ElGamal 方案加密消息,我按以下步骤进行: Security.addProvider(new org.bouncycastle.jce.provider.Bouncy
我是一名优秀的程序员,十分优秀!