【问题标题】:Format-preserving Encryption sample保格式加密示例
【发布时间】:2011-10-11 10:49:39
【问题描述】:

我想使用格式保留加密将数字加密/解密为长度相同的字符串(只有数字和/或大写字符)。但我没有找到实施步骤。那么,任何人都可以提供 C# 2.0 的 WORKING 示例吗?

举个例子,

如果我加密固定长度的明文,例如 99991232(带或不带固定密钥),那么密码应该类似于 23220978 或 ED0FTS。如果加密字符串的长度小于纯文本,那么也可以。但密文长度不能大于明文,密文必须是固定长度的。

【问题讨论】:

  • “格式保留加密”不是一个真实的词。请描述你想要什么,提供例子。
  • 检查这个Fromat-preserving Encryption 我已经添加了输入和所需输出的示例。不幸的是,我不能告诉你我需要它的目的是什么。我希望你能理解。此外,我也知道使用这种算法的加密可能不安全,但对于我的需要来说是完全公平的。
  • 好的,你的名字是对的,在这个例子中这是一个完全有效的问题。

标签: c# encryption


【解决方案1】:

根据您的问题,我假设纯文本是数字,而密文可能是字母数字。因此,制作编码方案非常容易。这使您的格式保存不那么严格,并且可以利用这一点(如果您的纯文本也是字母数字,这将不起作用)。

首先,找到大于您拥有的离散值数量的 2 的幂,例如,在数字情况下,您有 10 个离散值 - 所以您将使用 16 (2 ^ 4)。为此创建一个“BaseX”编码方案(在本例中为 Base16)并使用它将纯文本解码为二进制。

因此给定纯文本:

1、2、3、4

我们将其编码为:

0001-0010 0011-0100

然后,您可以通过您的长度保持密码运行此操作(长度保持密码的一个示例是 AES in counter mode)。假设您得到以下值:

1001-1100 1011-1100

使用您的“BaseX”编码器对其进行编码,在我们的例子中,我们会得到:

9、C、B、C

长度相同。我为你整理了一个sample(有点大,无法粘贴在这里)。

【讨论】:

  • 您提供的逻辑肯定很棒!我要检查一下,过一段时间再回来。非常感谢!
  • 简直太棒了!!!它顺利解决了这个问题......非常感谢乔纳森......你让我很开心:-)
【解决方案2】:

正如 Henk 所说,“格式保留加密”没有定义。我能想到两个可能的答案:

  1. 使用 AES 并将密文字节数组转换为十六进制字符串或 Base64。
  2. 使用简单的Vigenère cipher 来替换您要替换的字符。

您需要更清楚地指定您的要求。

ETA:你没有说你需要它有多安全。标准的 Vigenère 无法抵御任何形式的强烈攻击,但不会受到普通用户的攻击。 Vigenère 可以变得绝对安全,但这需要尽可能多的真正随机密钥材料,因为有明文可以加密,而且通常是不切实际的。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2013-07-03
    • 1970-01-01
    • 2016-02-28
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多