7

我正在尝试实现一个简单的字符串编码器来混淆 URL 字符串的某些部分(以防止它们被用户弄乱)。我使用的代码几乎与JCA 指南中的示例相同,除了:

  • 使用 DES(假设它比 AES 快一点,并且需要更小的密钥)和
  • Base64 编码/解码字符串以确保它对 URL 保持安全。

由于我无法理解的原因,输出字符串以换行符结尾,我认为这不起作用。我无法弄清楚是什么原因造成的。关于更容易阅读的类似内容的建议或指向其他一些阅读资源的指针?我发现所有的密码学参考有点过头了(而且矫枉过正),但是一个简单的 ROT13 实现将不起作用,因为我想处理更大的字符集(并且不想浪费时间实现一些可能有我没有想到的晦涩字符的问题)。

示例输入(无换行符):

http://maps.google.com/maps?q=kansas&hl=en&sll=42.358431,-71.059773&sspn=0.415552,0.718918&hnear=Kansas&t=m&z=7

示例输出(如下所示的换行符):

GstikIiULcJSGEU2NWNTpyucSWUFENptYk4m5lD8RJl8l1CuspiuXiE9a07fUEAGM/tC7h0Vzus+
jAH6cT4Wtz2RUlBdGf8WtQxVDKZVOzKwi84eQh2kZT9T3KomlnPOu2owJ/2RAEvG+QuGem5UGw==

我的编码片段:

final Key key = new SecretKeySpec(seed.getBytes(), "DES");
final Cipher c = Cipher.getInstance("DES");
c.init(Cipher.ENCRYPT_MODE, key);
final byte[] encVal = c.doFinal(s.getBytes());
return new BASE64Encoder().encode(encVal);
4

4 回答 4

14

只需base64Str = base64Str.replaceAll("(?:\\r\\n|\\n\\r|\\n|\\r)", "") 对编码的字符串执行。

当您尝试将其解码回字节时,它工作正常。我确实使用随机生成的字节数组对其进行了多次测试。显然,解码过程只是忽略换行符,无论它们是否存在。com.sun.org.apache.xml.internal.security.utils.Base64 我使用未测试的其他编码器测试了这个“确认工作” 。

于 2013-12-14T19:15:23.330 回答
8

Base64 编码器通常会施加一些最大行()长度,并在必要时添加换行符。您通常可以配置它,但这取决于特定的编码器实现。例如,来自Apache Commons的类 有一个linelength属性,将其设置为零(或负数)会禁用行分隔。

顺便说一句:我同意另一个答案,因为今天几乎不建议使用 DES。此外,您只是“混淆”还是真正加密?谁有钥匙?整件事对我来说闻起来不太好。

于 2012-04-23T14:41:11.423 回答
4

导入 android.util.Base64;

...

返回新的 BASE64.encodeToString(encVal, Base64.NO_WRAP);

于 2016-06-08T10:48:53.813 回答
1

虽然它与您的实际问题无关,但 DES 通常比 AES(至少在软件中),所以除非您真的需要保持较小的密钥,否则 AES 几乎肯定是一个更好的选择。

其次,加密(DES 或 AES)会/将在其输出中产生换行符是完全正常的。在没有它们的情况下产生输出将完全取决于 base-64 编码器,所以这显然是您需要查看的地方。

不过,看到 base-64 在其输出中定期插入换行符并不特别令人惊讶。base-64 编码最常见的用途是将原始数据放入电子邮件正文之类的东西中,在那里很长的行会导致问题。为了防止这种情况,数据被分成几部分,通常不超过 80 列(通常会少一些)。但是,在这种情况下,应该忽略换行符,因此如果有记忆的话,您应该可以删除它们。

于 2012-04-23T14:42:07.847 回答