【问题标题】:How to encrypt a string with AES to a string with only specific characters?如何使用 AES 将字符串加密为仅包含特定字符的字符串?
【发布时间】:2014-10-21 17:59:42
【问题描述】:

我想使用条形码(代码 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");
}

谢谢!

【问题讨论】:

  • 那个“密钥派生”方法不是密钥派生方法。它会根据平台产生不同的结果。如果我没记错的话,它在最新版本的 Android 中停止工作了。

标签: java android cryptography aes barcode


【解决方案1】:

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

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

【讨论】:

  • 作为替代方案,Base32 编码也适合 43 个字符的限制,但代价是比 Base43 长。 Base32 更标准,如RFC 4648 中所定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2016-09-04
  • 1970-01-01
  • 2019-06-05
  • 2013-08-07
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多