到目前为止,我已经设法在充气城堡的轻量级API中生成ECDHE对.但是,我尝试从byte []重新创建公钥时遇到问题.
由于ECPublicKeyParameters对象只有一个方法getQ(),我假设重建密钥所需的全部内容.其他参数如使用的曲线(P-521)保持不变.
我正在做以下事情:
AsymmetricCipherKeyPair kp = kpgen.generateKeyPair(); //ECDHE Key Generator
ECPublicKeyParameters pubKey = (ECPublicKeyParameters)kp.getPublic();
byte[] aPubKeybytes = pubKey.getQ().getEncoded(false); //Should I set to true or false?
Run Code Online (Sandbox Code Playgroud)
除非有另一种方法来获取公钥pubKey的原始字节,否则我没有看到在不调用返回ECPoint对象的方法getQ()的情况下获取字节的方法.
我的问题是如何使用bouncy castle的轻量级API将byte []重建为ECPoint对象.或者,更好的是,如何使用从原始pubKey对象派生的字节数组重建整个ECPublicKeyParameter对象.
java bouncycastle elliptic-curve public-key-encryption diffie-hellman
是否有用于实现diffie helman的python标准库?我看过了python pyopenssl中的openssl包装器,它没有覆盖它。我也无法在NaCl或cryptography.io库中找到它。
简要 :
Alice 和 Bob 试图进行交流,但不想让 Eve(正在倾听)知道他们要谈论什么。
所以
Bad Eve
|
|
Alice ------------+--------------- Bob
Run Code Online (Sandbox Code Playgroud)
爱丽丝和鲍勃公开同意质数模数和生成器。
说
所以公式将是(例如):
3^x % 17
Run Code Online (Sandbox Code Playgroud)
好的。
Alice 选择一个私人号码(比如15)并且3^15 %17 => 6
Bob 选择一个私人号码(比如13)并且做3^13 %17 => 12
现在,爱丽丝和鲍勃告诉对方他们的结果(不是他们的私钥),而夏娃正在倾听。
所以现在的情况是:
Bad Eve ( knows : 3^x %17 , 12,6)
|
|
Alice ------------+--------------- Bob
(15)private (13)private
12(Bob's) 6(Eve's)
Run Code Online (Sandbox Code Playgroud)
现在爱丽丝拿着鲍勃的 12 和她的私钥并执行以下操作:
((other's public num) ^ secret …Run Code Online (Sandbox Code Playgroud) 对于使用Nginx在Ubuntu 16中托管的网站,SSL测试始终显示B级。下面是显示的原因。另请参阅附件图像。当前的SSL密码设置如下。我注意到在使用ubuntu 16和Nginx的大约8到10台服务器中有同样的事情。
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers 'AES256+EECDH:AES256+EDH::!EECDH+aRSA+RC4:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_session_cache shared:SSL:10m;
Run Code Online (Sandbox Code Playgroud)
Diffie-Hellman(DH)密钥交换参数。等级上限为B
我需要支持 Diffie Hellman 加密,现在为了测试这一点,我需要创建一个带有 DH 密钥参数的证书,例如。密钥长度 - 2048 等
现在据我了解 DH 不适用于自签名证书,所以基本上我需要创建一个由一些受信任的第三方颁发的包含 DH 密钥参数的证书。
我搜索了很多,但似乎找不到正确的方向,我在哪里可以找到使用 DH 参数创建证书的方法。
有人能指出我正确的方向吗?提前致谢!!
encryption cryptography ssl-certificate diffie-hellman tls1.2
我的问题看起来像这样.我在卡和终端侧生成了密钥.我在终端侧有卡公钥和私钥以及终端公钥和私钥,卡侧也一样(我正在做测试,这就是为什么我把它们全部放在终端和卡上).当我为卡生成KeyAgreement(终端侧)作为私有而终端作为私有时,secters是相同的,所以生成是正常的,我得到一个24字节(192位)的秘密.当我在卡上产生秘密时(2个情况就像在终端上一样),秘密也是相同的,但它们更短--20个字节(160位).这是代码.终点站:
ECPublicKey publicKey;
ECPrivateKey privateKey;
Run Code Online (Sandbox Code Playgroud)
...
KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC");
aKeyAgree.init(privateKey);
aKeyAgree.doPhase(publicKey, true);
byte[] aSecret = aKeyAgree.generateSecret();
Run Code Online (Sandbox Code Playgroud)
和卡方面:
eyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
short length = terminalEcPublicKey.getW(array, (short) 0);
keyAgreement.init(cardEcPrivateKey);
short secretlength = keyAgreement.generateSecret(array, (short)0, length, buffer, (short)0);
Run Code Online (Sandbox Code Playgroud) 我在这里读书
如果我验证安全性
https://www.ssllabs.com/ssltest/analyze.html
我的一个使用certbot 的网站因此被评为 B
有解决办法吗?
certbot 基本上是许多系统的https://letsencrypt.org/的实现。
我正在尝试使用最新的节点映像(节点版本:v13.10.1)在 Docker 容器中运行的 Python 3.6 客户端和节点服务器之间进行 DH 密钥交换。
我在 python 客户端使用cryptography.io (2.9.2) 库。客户端生成 DH 密钥并将十六进制编码的公钥发送到服务器。这是代码片段:
MODP15_HEX_PRIME = "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"
...
def generate_DH_key():
# MODP 15 -> generator=2, key_size=3072 https://www.rfc-editor.org/rfc/rfc3526.txt
dh_parameters = dh.DHParameterNumbers(p=int(MODP15_HEX_PRIME, 16), g=2).parameters(backend=default_backend())
client_private_dh_key = dh_parameters.generate_private_key()
return client_private_dh_key
def send_signed_dh_key(client_public_dh_key):
dh_key_bytes = client_public_dh_key.public_bytes(encoding=serialization.Encoding.DER, format=serialization.PublicFormat.SubjectPublicKeyInfo)
response = requests.post(CRYPTO_ORACLE_URL, headers=CRYPTO_ORACLE_HEADERS,
data=json.dumps({'key': dh_key_bytes.hex()))
if response.status_code != 200:
print('Something went wrong sending client signed DH: ' + response.reason)
exit(-1)
Run Code Online (Sandbox Code Playgroud)
服务器使用加密库根据收到的 DH 密钥计算秘密。这是代码片段:
const generateSecret=(clientDHPublic)=>{
...
serverDH = crypto.getDiffieHellman("modp15");
serverDH.generateKeys();
console.log("server DH public:") …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Python 重写以下代码。原始代码是使用sjcl库用 Javascript 编写的。
// Inputs
var serverPubX = "WIUBDotrk02Rk/apL11jQPbmX0quyaYz2EIkGUlVf7s=";
var serverPubY = "diZ2CbfSUy5Kr82OIfd4Ajusq2K+/kjGZ7ymcqVwn2k=";
// The code
var serverPubXBits = sjcl.codec.base64.toBits(serverPubX);
var serverPubYBits = sjcl.codec.base64.toBits(serverPubY);
var serverPubKeyPointBits = serverPubXBits.concat(serverPubYBits);
var serverPubKey = new sjcl.ecc.elGamal.publicKey(
sjcl.ecc.curves.c256, serverPubKeyPointBits);
var clientKeys = sjcl.ecc.elGamal.generateKeys(256, 1);
// What I need:
var sharedKey = clientKeys.sec.dhJavaEc(serverPubKey);
Run Code Online (Sandbox Code Playgroud)
我的主要问题是dhJavaEc功能。根据 sjcl 文档,它是Java 兼容的 Diffie-Hellmann 函数。但是我在 pycryptodome 库中找不到任何等效的东西。
我检查了dhJavaEc代码这是它的作用:
// Looks like it converts the server key to Jacobian and then multiply …Run Code Online (Sandbox Code Playgroud) 我遇到了Diffie Hellman实现的问题.我正在使用此代码 http://www.java2s.com/Tutorial/Java/0490__Security/DiffieHellmanKeyAgreement.htm
这实际上是我正在阅读的一本书中的一个例子.但我无法理解为什么generateSecret()为每个人创造一个不同的钥匙KeyAgreement.我注意到该函数创建了不同的键,即使我用相同的KeyAgreement两次调用它!如果有人建议我会很高兴!
谢谢你的时间!
据我所知,通常 Diffie-Hellman 密钥是 2048 位,但我的计算机几乎无法计算 10 位数字。Diffie-Hellman 中有哪些常见数字?
这是我的代码,速度非常慢:
$gen = 77;
$mod = 517165;
$saltA = 1233217;
$saltB = 5173123;
$calculatedSecretKeyA = gmp_mod(gmp_pow($gen, $saltA), $mod);
$calculatedSecretKeyB = gmp_mod(gmp_pow($gen, $saltB), $mod);
$calcKeyA = gmp_mod(gmp_pow($calculatedSecretKeyB, $saltA), $mod);
echo $calculatedSecretKeyB . "^" . $saltA . "" . " mod " . $mod . " = " . $calcKeyA;
$calcKeyB = gmp_mod(gmp_pow($calculatedSecretKeyA, $saltB), $mod);
echo $calculatedSecretKeyA . "^" . $saltB . "" . " mod " . $mod . " = " . …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 bouncycastle 在我的 java 程序中实现 curve25519,这是我想出的代码:
package crypto;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
public class Curve {
public KeyPair generateKeyPair() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
X9ECParameters ecP = CustomNamedCurves.getByName("curve25519");
ECParameterSpec ecSpec = new ECParameterSpec(ecP.getCurve(), ecP.getG(), ecP.getN(), ecP.getH(), ecP.getSeed());
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
keyGen.initialize(ecSpec);
return keyGen.generateKeyPair();
}
}
Run Code Online (Sandbox Code Playgroud)
而我的主要方法:
package crypto;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Test_Curve {
public static …Run Code Online (Sandbox Code Playgroud) 我想在Java中存储一个长整数,特别是RFC 3526中的6144位MODP组(第17组).但是这个数字似乎不适合BigInteger.有没有办法在Java中使用这个素数?
编辑:我试过了
BigInteger p = new BigInteger(Integer.toString(pValue));
p = 33751521821438561184518523159967412330064897805741846548173890474429429901326672445203235101919165483964194359460994881062089387893762814044257438204432573941083014827006090258925875161018096327732335800595831915976014208822304007327848132734933297885803213675261564962603340457220776826322500058091310967253976619973988033663666385188155212656268079501726223369693427999804134467810120772356498596945532366527400517575471969335854905274504119509592366013711954148258884879224599915203456315881034776553083676995718335598586395591169999570824515035017543533352697525287753332500527176569576894926734950469293596134095086603716860086302051544539652689091299099784588919052383463057789440565460681441902442399956419060521629604697347879024654313800186078316526964529288062740879011035175920059192178561473199006205896719435014765345518490882366607110905303449152556221163232127426440691921134648766635695850239231304591744215610985029636895406718880766308249227315984267542266259489684372223916445411015900506239419267909716320331208988978180868987431623710347617992356201449023892203230133009421463914291201346063125219636964261683591541014344239275340735690997732222069758773963390876360546515755280517042160525487302898122311669799679447530453600399342697032714458549591285939453949034981248114322322367238645042515984447890788917823576330019151696568654314153058547592091366014550143819685170068343700104677609041166369760080933413605498962382077778845599834907475953430787446201384567328530675275792962354883770806900827183685718353469574731680520621944540947734619035177180057973022652571032196598229259194875709994709721793154158686515748507274224181316948797104601068212015232921691482496346854413698719750190601102705274481050543239815130686073601076304512284549218459846046082253596762433827419060089029417044871218316020923109988915707117567;
Run Code Online (Sandbox Code Playgroud) diffie-hellman ×13
cryptography ×5
bouncycastle ×4
java ×4
encryption ×2
python ×2
ssl ×2
c# ×1
certbot ×1
javacard ×1
javascript ×1
lets-encrypt ×1
nginx ×1
node.js ×1
php ×1
public-key ×1
starttls ×1
tls1.2 ×1
ubuntu-16.04 ×1