如何使用AES将字符串加密为只包含特定字符的字符串?

时间:2014-10-21 17:59:42

标签: java android cryptography aes barcode

我想使用条形码(代码39)来表示字符串,我希望使用AES加密此字符串。

但是,我只能使用barcode显示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");
}

谢谢!

1 个答案:

答案 0 :(得分:2)

您所拥有的是编码问题,您要转换为非标准编码的问题。我要做的是转换为base43编码。但是,您可能需要实现自己的转换。您应该研究如何在任意碱基之间进行转换,并对加密的字节输出进行转换。本质上,您将获取字节的base10值(如果是无符号,则在0到255之间),并将其转换为两个不同的base43字符。

快速谷歌搜索base43给了我this。我没有用过自己,但看起来它可以工作。