爪哇 - 的Diffie-Hellman加密 - 输出错误 [英] Java - Diffie-Hellman Encryption - Wrong Output

查看:133
本文介绍了爪哇 - 的Diffie-Hellman加密 - 输出错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图实现的Diffie-Hellman密钥交换。我对如何使用,一旦产生的密钥有点糊涂了。

正如在输出看出,使用相同的素&放大器产生的2秘密密钥;碱在密钥交换交易生成所述密钥时,然而,我预期它们不会输出相同的值。公钥为正常,以及

我得到很迷茫与如何实现这种加密方法将是某个方向非常感激。我这个总的目标是实现一个加密的短信Android应用程序。

结果
    (截图无法捕获&安培的整个长度; B的碱基放大器;素)

  AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance(卫生署);
paramGen.init(512); //比特数
的AlgorithmParameters PARAMS = paramGen.generateParameters();
DHParameterSpec dhSpec =(DHParameterSpec)params.getParameterSpec(DHParameterSpec.class);BigInteger的P512 = dhSpec.getP();
BigInteger的G512 = dhSpec.getG();//一个
的KeyPairGenerator akpg = KeyPairGenerator.getInstance(DiffieHellman);DHParameterSpec参数=新DHParameterSpec(P512,G512);
的System.out.println(总理:+ P512);
的System.out.println(基地+ G512);
akpg.initialize(参数);
密钥对KP = akpg.generateKeyPair();// B
的KeyPairGenerator bkpg = KeyPairGenerator.getInstance(DiffieHellman);DHParameterSpec参数2 =新DHParameterSpec(P512,G512);
的System.out.println(总理:+ P512);
的System.out.println(基地+ G512);
bkpg.initialize(参数2);
密钥对KP2 = bkpg.generateKeyPair();
协议密钥aKeyAgree = KeyAgreement.getInstance(DiffieHellman);
协议密钥bKeyAgree = KeyAgreement.getInstance(DiffieHellman);aKeyAgree.init(kp.getPrivate());
bKeyAgree.init(kp2.getPrivate());aKeyAgree.doPhase(kp2.getPublic(),TRUE);
bKeyAgree.doPhase(kp.getPublic(),TRUE);//System.out.println(\"Alice秘密键:+ aKeyAgree.generateSecret());
//System.out.println(\"Bob's秘密键:+ bKeyAgree.generateSecret());消息摘要哈希= MessageDigest.getInstance(SHA-256);字节[] = ASharedSecret hash.digest(aKeyAgree.generateSecret());
字节[] = BSharedSecret hash.digest(bKeyAgree.generateSecret());的System.out.println(爱丽丝的共享密钥:+ ASharedSecret.toString());
的System.out.println(鲍勃的共享秘密:+ BSharedSecret.toString());


解决方案

字节[]。的toString()不打印的内容。尝试Arrays.toString()。

I'm attempting to implement Diffie-Hellman key exchange. I am a little confused with how to use the secret key once generated.

As seen in the output, the 2 secret keys are generated using the same prime & base as normal in the key exchange, and trade public keys when generating the secret keys, however they are not outputting the same value as I expected.

I'm getting very confused with how to implement this encryption method and would be very grateful for some direction. My overall aim for this is to implement an encrypted SMS Android application.


(The screenshot was unable to capture the entire length of a & b's base & prime)

AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH");
paramGen.init(512); // number of bits
AlgorithmParameters params = paramGen.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec)params.getParameterSpec(DHParameterSpec.class); 

BigInteger p512 = dhSpec.getP();
BigInteger g512 = dhSpec.getG();

//A  
KeyPairGenerator akpg = KeyPairGenerator.getInstance("DiffieHellman");

DHParameterSpec param = new DHParameterSpec(p512, g512);
System.out.println("Prime: " + p512);
System.out.println("Base: " + g512);
akpg.initialize(param);
KeyPair kp = akpg.generateKeyPair();

//B
KeyPairGenerator bkpg = KeyPairGenerator.getInstance("DiffieHellman");

DHParameterSpec param2 = new DHParameterSpec(p512, g512);
System.out.println("Prime: " + p512);
System.out.println("Base: " + g512);
bkpg.initialize(param2);
KeyPair kp2 = bkpg.generateKeyPair();


KeyAgreement aKeyAgree = KeyAgreement.getInstance("DiffieHellman");
KeyAgreement bKeyAgree = KeyAgreement.getInstance("DiffieHellman");

aKeyAgree.init(kp.getPrivate());
bKeyAgree.init(kp2.getPrivate());

aKeyAgree.doPhase(kp2.getPublic(), true);
bKeyAgree.doPhase(kp.getPublic(), true);

//System.out.println("Alice Secret Key: " + aKeyAgree.generateSecret());
//System.out.println("Bob's Secret Key: " + bKeyAgree.generateSecret());

MessageDigest hash = MessageDigest.getInstance("SHA-256");

byte[] ASharedSecret = hash.digest(aKeyAgree.generateSecret());
byte[] BSharedSecret = hash.digest(bKeyAgree.generateSecret());

System.out.println("Alice's Shared Secret: " + ASharedSecret.toString());
System.out.println("Bob's Shared Secret: " + BSharedSecret.toString());

解决方案

byte[].toString() doesn't print the contents. Try Arrays.toString().

这篇关于爪哇 - 的Diffie-Hellman加密 - 输出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆