【问题标题】:java - make string unreadable [closed]java - 使字符串不可读[关闭]
【发布时间】:2023-04-08 19:21:01
【问题描述】:

我需要尽可能短且快速的代码来将字符串更改为不可读的内容(对于人类而言),并使其再次可读。这一切都需要在 java 中发生。

类似这样的:

encrypt("test");

会产生这样的结果:

ôT¿ÄÜTV CÁˆ“5="ËÂÀœššbÀß{¡ä³

decrypt("ôT¿ÄÜTV CÁˆ“5 1="ËÂÀœššbÀß{¡ä³");

会再次变成原来的结果

test

我应该往哪个方向走,有没有可以为我做这件事的课程?我不是指 Base68Encryption 之类的东西或任何可能被称为的东西,我指的是我可以安全地通过 Internet 发送的真正不可读的文本。

【问题讨论】:

  • Base_64 是否可供人类阅读?嗯,你认识一些聪明的人。
  • 为了安全地公开共享加密消息,您需要共享密码或公钥/私钥加密。请详细说明您实际需要防范的威胁。休闲阅读?更强大的东西?
  • @jsn 不,但是很简单
  • @Roller 您对问题的措辞向我表明,ROT13 将是一个可以接受的答案。计算机很容易破译,但大多数人不会打扰,因此人类无法阅读。

标签: java string crypt


【解决方案1】:

我应该往哪个方向走,有没有可以为我做这件事的课程?我不是指 Base68Encryption 之类的东西或任何可能被称为的东西,我指的是我可以安全地通过 Internet 发送的真正不可读的文本。

有两种方法可以解决这个问题:

  • 您可以选择在典型 JVM 中作为标准实施的现有高质量加密系统之一。那么:

    1. 将字符串编码为字节;例如使用 UTF-8。

    2. 使用约定的加密系统和先前约定的密钥对字节进行加密。

    3. 使用 base_64 或等效方法对字节进行编码。

    在另一端:

    1. 解码 base_64

    2. 使用相同的系统和密钥解密字节。

    3. 解码 UTF-8 以获取字符串。

  • 使用 SSL/TLS 保护 TCP/IP 连接,并按原样通过连接发送字符串。

这些选项都不是特别快。但不要试图发明自己更快的加密系统。很有可能一个“自制”的加密系统比你想象的更容易破解。

【讨论】:

    【解决方案2】:

    这是一个使用真正加密的非常简短的示例。它是 128 位 AES,非常安全 - 任何想象都无法读取。

    它会生成一个随机密钥,因此每次运行都会有所不同。您需要以某种方式在交换数据的两个程序之间共享它们的密钥。

    private static final String ENCRYPTION_ALGORITHM = "AES/ECB/PKCS5Padding";
    private static final SecureRandom RANDOM = new SecureRandom();
    
    public static void main(String[] args) throws UnsupportedEncodingException, GeneralSecurityException {
        final KeyGenerator keyGen = KeyGenerator.getInstance(ENCRYPTION_ALGORITHM.substring(0, ENCRYPTION_ALGORITHM.indexOf('/')));
        keyGen.init(128, RANDOM);
        final SecretKey key = keyGen.generateKey();
        final String s = "My topsecret string";
        System.out.println(s);
        final Cipher encryption = getCipher(key, Cipher.ENCRYPT_MODE);
        final String enc = DatatypeConverter.printBase64Binary(encryption.doFinal(s.getBytes("UTF-8")));
        System.out.println(enc);
        final Cipher decryption = getCipher(key, Cipher.DECRYPT_MODE);
        final String dec = new String(decryption.doFinal(DatatypeConverter.parseBase64Binary(enc)), "UTF-8");
        System.out.println(dec);
    }
    
    private static Cipher getCipher(final Key key, final int mode) throws GeneralSecurityException {
        final Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
        cipher.init(mode, key, RANDOM);
        return cipher;
    }
    

    输出:

    My topsecret string
    ip4La5KUBJGTTYenoE920V5w0VBHwALv4fp3qyLTY9o=
    My topsecret string
    

    【讨论】:

      【解决方案3】:

      通过示例代码http://www.code2learn.com/2011/06/encryption-and-decryption-of-data-using.html查看数据算法的加密和解密。加密/解密嵌入在JRE中,使用起来并不难。

      【讨论】:

        最近更新 更多