gpt4 book ai didi

java - Java中的加密

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:44 25 4
gpt4 key购买 nike

我有一个文本配置文件。此文件需要加密并随产品一起提供,以便最终用户无法更改值。

我研究了 AES 来做这件事并遇到了这个简单的例子。


import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

/**
* This program generates a AES key, retrieves its raw bytes, and
* then reinstantiates a AES key from the key bytes.
* The reinstantiated key is used to initialize a AES cipher for
* encryption and decryption.
*/
public class AES
{

/**
* Turns array of bytes into string
*
* @param buf Array of bytes to convert to hex string
* @return Generated hex string
*/
public static String asHex(byte buf[])
{
StringBuilder strbuf = new StringBuilder(buf.length * 2);
int i;

for (i = 0; i < buf.length; i++)
{
if (((int) buf[i] & 0xff) < 0x10)
{
strbuf.append("0");
}

strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}

return strbuf.toString();
}

public static void main(String[] args) throws Exception
{

String message = "This is just an example";

// Get the KeyGenerator

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available


// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


// Instantiate the cipher

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("encrypted string: " + asHex(encrypted));

cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " + originalString + " " + asHex(original));
}
}

这是一个好方法吗?我可以将配置文件作为字符串获取,对其进行编码,然后将编码后的字节写入文件。然后我可以分发编码文件。

但在另一端,我将如何破译它?如何分发 key 规范以使其能够被破译?

谢谢

最佳答案

(重新发布我的评论的一个略有删节的版本作为答案,因为它获得了几票,我非常相信这就是答案。)

您面临着与电影和游戏行业相同的问题,答案是:您能做的最好的事情就是让用户难以更改文件;你不能让它变得不可能。解密 key 必须驻留在您的代码中(或硬件中,如果您也生产硬件),可以通过逆向工程获得它。您也可以加密 key ,但第二个 key 必须存储在您的代码中,依此类推。如果您决定在代码中存储文件的哈希值并使用它来验证文件未被篡改,您将遇到类似的问题,因为这样有人可能会更改您的可执行文件中的哈希值(编辑:或简单地更改完全跳过哈希检查的代码)。

正如@limc 提到的,您可以采用一些中央验证方案,解决它们带来的所有问题和用户敌意。我认为 @Mr Jacques 的建议是你最好的选择,除非你真的需要它 100% 防黑客(在这种情况下我认为你有一个大问题),因为它会阻止绝大多数用户(直到有人发布裂纹,就是……)

关于java - Java中的加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5144978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com