Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将带有AES的字符串加密为只包含特定字符的字符串?_Java_Android_Cryptography_Aes_Barcode - Fatal编程技术网

Java 如何将带有AES的字符串加密为只包含特定字符的字符串?

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

我想用条形码(代码39)来表示一个字符串,我想用AES对这个字符串进行加密

但是,我只能显示43个字符。如何对其进行加密,使结果仅使用可用的字符集

以下是我目前掌握的情况:

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中停止了工作。