Java 如何将带有AES的字符串加密为只包含特定字符的字符串?
我想用条形码(代码39)来表示一个字符串,我想用AES对这个字符串进行加密 但是,我只能显示43个字符。如何对其进行加密,使结果仅使用可用的字符集 以下是我目前掌握的情况:Java 如何将带有AES的字符串加密为只包含特定字符的字符串?,java,android,cryptography,aes,barcode,Java,Android,Cryptography,Aes,Barcode,我想用条形码(代码39)来表示一个字符串,我想用AES对这个字符串进行加密 但是,我只能显示43个字符。如何对其进行加密,使结果仅使用可用的字符集 以下是我目前掌握的情况: public static byte[] encryptAES(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getBytes("ASCII")); SecretKeySpec
public static byte[] encryptAES(String seed, String cleartext)
throws Exception {
byte[] rawKey = getRawKey(seed.getBytes("ASCII"));
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
return cipher.doFinal(cleartext.getBytes("ASCII"));
}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(BLOCKS, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
public static void main(String [] args)
{
String str = "312432432";
String key = "4AFJ3243J";
String result = new String(encryptAES(key,str), "ASCII");
}
谢谢 您遇到的是编码问题,问题是您希望转换为非标准编码。我要做的是转换成base43编码。但是,您可能需要实现自己的转换。您应该研究如何在任意基之间进行转换,并对加密的字节输出进行转换。基本上,您将获取字节的base10值(如果无符号,则介于0和255之间),并将其转换为两个不同的base43字符
我在谷歌上快速搜索了一下base43。我自己没有使用过,但看起来它可以工作。作为替代方案,Base32编码也适合43个字符的限制,但代价是比Base43长。Base32更为标准,定义为“键派生”方法不是键派生方法。它将根据平台产生不同的结果。如果我没记错的话,它在最新版本的Android中停止了工作。