【问题标题】:Encrypt data, send it with UDP to a server, then decrypt it [duplicate]加密数据,使用 UDP 将其发送到服务器,然后对其进行解密 [重复]
【发布时间】:2020-08-14 03:05:24
【问题描述】:

我要做的是使用 javax.crypto 将字符串加密为 byte[],通过 DatagramSocket 发送,然后在接收端解密。

public static final String UNICODE = "UTF-8";

private SecretKey key;
private Cipher cipher;

public StringHandler() {
    try {
        key = generateKey("AES");
        cipher = Cipher.getInstance("AES");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private SecretKey generateKey(String type) throws Exception {
    KeyGenerator gen = KeyGenerator.getInstance(type);
    SecretKey key = gen.generateKey();
    return key;
}

public byte[] encrypt(String msg) {
    try {
        byte[] data = msg.getBytes(UNICODE);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(data);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public String decrypt(byte[] data) {
    try {
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(data), UNICODE);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

我在一个网站上阅读了如何加密和解密数据,并编写了这个课程。据我所知,双方的安全密钥必须相同才能正确解密。有没有办法将它转换为字符串或其他东西,然后从服务器端的字符串中获取它?目前我不知道如何在不同的程序上解密它。

【问题讨论】:

  • 好吧,要么您有密钥分配问题,要么您需要使用编码到程序中的固定密钥。
  • 实际上,您似乎只是在问如何将 SecretKey 转换为 String 并返回。见stackoverflow.com/questions/5355466/…

标签: java cryptography


【解决方案1】:

您可以将表示为字节数组的键转换为可以作为“文本”发送的形式。 Base64 编码是一种常用的方法。

但这并不能解决您的真正问题:

有什么办法可以把它转成字符串什么的,然后在服务器端从字符串中获取?

真正的问题是如何安全地将代表密钥的字符串发送到服务器;即没有其他人能够在传输过程中窃取密钥。

而答案是你不能……不使用另一种加密机制:

  • 一种使用客户端和服务器都知道的不同密钥加密密钥的可能性。
  • 第二种可能性是使用公钥加密。
  • 第三种可能性是使用安全通信系统来传输密钥。例如基于量子密码学的网络。

这是一个太大的话题,无法在这里讨论。如果您想了解“密钥分配问题”及其解决方案,请找到一本好的教科书。或者从这些维基百科文章开始:

【讨论】:

  • 我了解密钥分配问题,我不打算来回发送密钥。例如,在 enigma 中,之前已经布置了双方都知道的用于编码和解码的配置。我正在尝试做类似的事情,在那里我可以拥有一个双方都相同的密钥,就像硬编码一样。我真正需要的是如何获取安全密钥 byte[] 以及如何从字节[]。不过感谢您的其他帮助,我几乎可以肯定在以后的某个时候需要它。
  • 如果这就是你要问的全部:stackoverflow.com/questions/5355466/…
  • 您可以使用 ByteBuffer 并将密钥附加到消息中,另一方面您从 byte[] 中提取密钥部分并使用它来解密消息。
  • @J.Adler - 从技术上讲,是的。在实践中......这是非常不安全的,除非您已采取措施首先加密密钥。但事实证明,OP 实际上根本没有询问传输密钥。 (阅读他上面的评论!)
  • 我似乎遇到了另一个问题。当我创建一个 DatagramPacket 的实例时,我使用了一个空白字节 [1024],并且所有额外未使用的字节都会扰乱解密。有什么简单的解决办法吗?
猜你喜欢
  • 2020-04-03
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多