通过套接字交换加密密钥

时间:2014-03-13 18:57:32

标签: java sockets encryption cryptography

我正在制作的是一个加密/解密邮件发送的聊天程序。到目前为止,我已经与客户建立了基本的全面通信,并使用AES进行了服务器到客户端的简单加密,基本上我给了他们相同的密钥。现在我想建立一个密钥交换算法,允许每个客户端拥有自己的密钥。我已经阅读了多种算法,起初我想建立一个Diffie-Hellman,但我发现了一些RSA例子,这些算法更加精确。这就是我所拥有的:

public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, 
InvalidKeyException, IllegalBlockSizeException, BadPaddingException  {

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
Key aesKey = keyGenerator.generateKey();



KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.genKeyPair();

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

byte[] aesKeyBytes = aesKey.getEncoded();
System.out.println("1. aesKeyBytes= "+ bytesToHex(aesKeyBytes));

cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] cipherText = cipher.doFinal(aesKeyBytes);
System.out.println("2. cipherText= "+bytesToHex(cipherText));

cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decryptedKeyBytes = cipher.doFinal(cipherText);
System.out.println("3. decryptedKeyBytes= "+bytesToHex(decryptedKeyBytes));


//use symmetric with the decrypted key
SecretKey newAesKey = new SecretKeySpec(decryptedKeyBytes, "AES");

基本上从这个代码结束的角度来看,我只是使用SecretKey来初始化我的AES密码并从那里继续。现在我的问题是如何通过套接字从RSA分发密钥而不丢失字节或其他任何东西,以便所有客户端都可以与服务器具有唯一的密钥对。还有一种方法是不使用密钥生成器并给出我自己的密钥,比如字符串,因为我打算使用setter以便用户可以更改他/她的密钥,否则如果所有客户端最终都使用keyexchange有什么意义呢?首先使用相同的键?最后一件事纯粹是好奇心,是否有可能将这个RSA修改为DH,它们在代码方面有何不同? 最后,“bytesToHex”方法如下,由我的老师提供给我,经过测试,它工作正常,所以没有问题:

public static String bytesToHex(byte[] data)
{

    if (data==null)
        return null;
    else
    {
        int len = data.length;

        String str = "";

        for (int i=0; i<len; i++)
        {
            if ((data[i]&0xFF)<16){
                str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);
                            }
                            else{
                str = str + java.lang.Integer.toHexString(data[i]&0xFF);
                            }
        }

        return str.toUpperCase();
    }
}

我知道可能会有像“看这个”和“这是一个很好的例子”的答案,但相信我,我已经看了所有这些,我只是更加困惑。为了清楚我不想使用文件存储我的密钥或类似的东西,我只想客户端和服务器相互发送他们的公钥,以便与他们的私钥一起创建一个secretKey,我知道这基本上是DH,但说实话,我现在非常厌倦了,我会接受我能得到的东西,所以你要说的任何事情都非常感激。

0 个答案:

没有答案