标签: elgamal

让GPG解密工作在Java(Bouncy Castle)

首先让我说我对这一切都是新手.我想要做的是使用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)

java bouncycastle openpgp elgamal

13
推荐指数
2
解决办法
2万
查看次数

免费实施Elgamal

我正在寻找Elgamal加密算法的免费实现.据我所知,即使它是一个广为人知的算法,似乎只有两个免费的实现:

OpenSSL,beecrypt,Nettle没有实现Elgamal.

列表中是否还缺少其他免费且经过良好测试的Elgamal实现?

open-source public-key-encryption elgamal

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

使用椭圆曲线ElGamal加密AES密钥

有爱丽丝和鲍勃。我想实现以下过程:

  1. 爱丽丝使用AES加密文本并生成密钥
  2. 爱丽丝使用El Gamal的椭圆曲线使用Bobs公钥对该秘密密钥进行加密
  3. 爱丽丝将加密的文本和加密的密钥发送给鲍勃
  4. 鲍勃用他的私钥解密密钥
  5. 鲍勃使用解密的密钥解密文本
  6. 完成了

我正在使用来自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)

java cryptography bouncycastle elliptic-curve elgamal

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

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

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

为什么我的ElGamal实现不适用于长文本字符串?

我正在玩El Gamal密码系统,我的目标是能够加密和破译长文本序列.

El Gamal要求明文为整数.我已经使用字符串的.getBytes()方法将我的字符串转换为byte [],然后在byte []中创建了一个BigInteger.在加密/解密之后,我使用BigIntegers的.toByteArray()方法将BigInteger转换为byte [],然后从byte []创建一个新的String对象.

我正在使用1035位密钥,当我使用最多129个字符的字符串加密/解密时,这非常有效.对于130个或更多字符,我的解密方法产生的输出是乱码.

有人可以建议如何解决这个问题吗?

java cryptography biginteger elgamal

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

将 ElGamal 加密从加密数字转换为字符串

我有以下 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)

string encryption encoding node.js elgamal

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