首先让我说我对这一切都是新手.我想要做的是使用Java中的gpg来解密加密文件.
我成功完成了什么:
有同事使用我的公钥和他的私钥加密文件并成功解密它.
走了另一条路
让另一位同事尝试解密一个不适合他的文件:失败(如预期的那样)
我的密钥是这样生成的......
(gpg --version告诉我我正在使用1.4.5而我正在使用Bouncy Castle 1.47)
gpg --gen-ley
选择选项"DSA和Elgamal(默认)"
填写其他字段并生成密钥.
该文件使用我的公钥和另一个密钥加密.我想解密它.我编写了以下Java代码来完成此任务.我正在使用几种弃用的方法,但我无法弄清楚如何正确实现使用非弃用版本所需的工厂方法,所以如果有人对我应该使用的那些实现有一个想法,那将是一个不错的奖金.
Security.addProvider(new BouncyCastleProvider());
PGPSecretKeyRingCollection secretKeyRing = new PGPSecretKeyRingCollection(new FileInputStream(new File("test-files/secring.gpg")));
PGPSecretKeyRing pgpSecretKeyRing = (PGPSecretKeyRing) secretKeyRing.getKeyRings().next();
PGPSecretKey secretKey = pgpSecretKeyRing.getSecretKey();
PGPPrivateKey privateKey = secretKey.extractPrivateKey("mypassword".toCharArray(), "BC");
System.out.println(privateKey.getKey().getAlgorithm());
System.out.println(privateKey.getKey().getFormat());
PGPObjectFactory pgpF = new PGPObjectFactory(
new FileInputStream(new File("test-files/test-file.txt.gpg")));
Object pgpObj = pgpF.nextObject();
PGPEncryptedDataList encryptedDataList = (PGPEncryptedDataList) pgpObj;
Iterator objectsIterator = encryptedDataList.getEncryptedDataObjects();
PGPPublicKeyEncryptedData publicKeyEncryptedData = (PGPPublicKeyEncryptedData) objectsIterator.next();
InputStream inputStream = publicKeyEncryptedData.getDataStream(privateKey, "BC");
Run Code Online (Sandbox Code Playgroud)
因此,当我运行此代码时,我了解到我的密钥的算法和格式如下:
算法:DSA格式:PKCS#8
然后它在最后一行打破:
Exception in thread "main" org.bouncycastle.openpgp.PGPException: error …
Run Code Online (Sandbox Code Playgroud) 我正在寻找Elgamal加密算法的免费实现.据我所知,即使它是一个广为人知的算法,似乎只有两个免费的实现:
OpenSSL,beecrypt,Nettle没有实现Elgamal.
列表中是否还缺少其他免费且经过良好测试的Elgamal实现?
有爱丽丝和鲍勃。我想实现以下过程:
我正在使用来自Bouncycastle的ECElGamalEncryptor类。我的问题是,据我所知,此类使用公共密钥对椭圆曲线上的点进行加密,但是我的AES秘密密钥不是ECPoint,而是十六进制。
假设我有此128位密钥用于AES加密:
6D5A7134743777397A24432646294A40
Run Code Online (Sandbox Code Playgroud)
这就是我到目前为止所拥有的:
import java.math.BigInteger;
import java.security.SecureRandom;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.sec.SECNamedCurves;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.ec.ECElGamalDecryptor;
import org.bouncycastle.crypto.ec.ECElGamalEncryptor;
import org.bouncycastle.crypto.ec.ECPair;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.math.ec.ECPoint;
class TestClass {
public static void main(String[] argv) {
// Get domain parameters for example curve secp256r1
X9ECParameters ecp = SECNamedCurves.getByName("secp256r1");
ECDomainParameters domainParams = new ECDomainParameters(ecp.getCurve(),
ecp.getG(), ecp.getN(), ecp.getH(),
ecp.getSeed());
// Generate a private key and a public key
AsymmetricCipherKeyPair …
Run Code Online (Sandbox Code Playgroud) 为什么El Gamal比RSA具有相同的模数长度?
El-Gamal的关键长度是多少?
我正在玩El Gamal密码系统,我的目标是能够加密和破译长文本序列.
El Gamal要求明文为整数.我已经使用字符串的.getBytes()方法将我的字符串转换为byte [],然后在byte []中创建了一个BigInteger.在加密/解密之后,我使用BigIntegers的.toByteArray()方法将BigInteger转换为byte [],然后从byte []创建一个新的String对象.
我正在使用1035位密钥,当我使用最多129个字符的字符串加密/解密时,这非常有效.对于130个或更多字符,我的解密方法产生的输出是乱码.
有人可以建议如何解决这个问题吗?
我有以下 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, …
Run Code Online (Sandbox Code Playgroud) elgamal ×7
cryptography ×4
encryption ×3
java ×3
bouncycastle ×2
security ×2
biginteger ×1
encoding ×1
node.js ×1
open-source ×1
openpgp ×1
rsa ×1
string ×1