gpt4 book ai didi

java - 如何将文本仅加密为纯文本字符串

转载 作者:行者123 更新时间:2023-11-30 02:41:04 25 4
gpt4 key购买 nike

我必须在我的程序中实现基本加密。我可以使用Base64,但被客户端拒绝了。所以我使用以下方法。我面临的问题是加密中存在特殊字符,导致异常。我可以更改此代码以某种方式加密为没有特殊字符的纯文本吗?

protected static byte[] encrypt(String text) 
{
try
{
String key = "6589745268754125";
// Create key and cipher
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
// encrypt the text
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] encrypted = cipher.doFinal(text.getBytes());
return encrypted;
}
catch(Exception ex)
{
WriteLog("Encryption Failed");
WriteLog(ex.getMessage());
return null;
}
}

protected static String decrypt(byte[] pass)
{
try
{
String key = "6589745268754125";
// Create key and cipher
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
// decrypt the text
cipher.init(Cipher.DECRYPT_MODE, aesKey);
String decrypted = new String(cipher.doFinal(pass));
return decrypted;
}
catch(Exception ex)
{
WriteLog("Encryption Failed");
WriteLog(ex.getMessage());
return null;
}
}
<小时/>

异常消息显示“鉴于最终 block 未正确填充”javax.crypto.BadPaddingException:给定的最终 block 未正确填充

最佳答案

所以,基本上你不了解加密,并且有客户想要加密的问题

好的,快速提示一下:

编码:将输入转换为包含相同信息但采用另一种表示形式的输出...例如:1,2,3 -> a,b,c

如您所见,输出看起来不同,但包含相同的信息

请注意,编码/解码不需要任何 secret 信息

加密:乍一看可能类似,但这里您需要一些 secret ...加密需要 2 个输入...一个 secret 和输入数据

结果输出可以被解密,但前提是你有相应的 secret

如果您的客户希望您加密某些内容,请确保该内容可以表示为字节...加密字符串...不好...加密已转换为<的字符串,在此处插入任意字节编码,例如 unicode > ... 好的

加密通常处理字节(这里我们不关心历史密码)

当您决定使用加密/密码时,您必须知道本质上有两个不同的组:对称和非对称

对称:解密时需要使用与加密相同的 key (读取 secret )

不对称:有由公共(public)部分和私有(private)部分(公共(public)/私有(private) key )组成的 key 对,公共(public)部分用于加密,私有(private)部分用于解密......没有意义,除非您有不同的各方需要交换 key

非对称密码通常用于加密解密对称密码的 key ,因为它们很慢,而对称密码通常很快

非对称密码不适用于加密大量数据

对称密码适用于批量数据

如果您的目标只是在硬盘上存储信息时对其进行加密,那么对称密码就是您想要的

您将需要一个 key 来操作密码...并且...您将遇到在哪里存储它的问题...所以如果可以的话,让用户输入一个足够复杂的密码...使用密码和一个名为 PBKDF2 的函数,该函数具有足够高的迭代计数(足够高=增加此数字,直到该过程需要几秒钟(如果您只在启动时需要它),或者直到您的用户开始提示延迟)来制作二进制 key 密码。

将此 key 用于 GCM 模式下的 AES(对称密码)

密码需要一些称为 IV 或初始化 vector 的东西......

iv 不是 secret ,您可以将其作为明文信息添加到您的密文中iv 需要是密码的一个 block 的大小,因此在 AES 128 位 = 16 字节的情况下因此,加密时您的 IV 是一个 16 字节(唯一)随机数(意味着您不能使用 IV 两次或更多次:保留使用过的 IV,并在获取新 IV 时检查它是否已存储,如果是则重新启动 IV生成,如果没有,则存储然后使用)

解密时,从文件中读取前置的明文 IV(前 16 个字节)

如果只想将密文存储在磁盘上,请将其写入二进制文件

如果文件必须仅包含可打印文本,则在将字节写入文件之前应用诸如base16/32/64之类的编码,并在解密之前解码为字节数组(除非您的数据太大,否则您将拥有查找/编写一个流包装器,它将为您添加/删除编码)

关于java - 如何将文本仅加密为纯文本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672314/

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