【发布时间】:2018-05-09 17:32:03
【问题描述】:
我正在开发一个实现简单替换密码的应用程序。现在出于速度原因(并且因为这是条件之一),我需要使用 BitArray 进行加密和解密。用户将输入“编码”字母,我需要以某种方式对其进行映射,因此我选择了 Dictionary,因为它使用哈希表并且在用户访问数据时具有 O(1) 复杂性。但是现在我发现自己想知道当我像这样初始化“编码”字母表时该怎么做:
BitArray codedAlphabet = new BitArray(bytes);
这将使我使用 2 个 for 循环来实现我的目标。有没有人有不同的想法?希望你明白我想要达到的目标。提前谢谢你。
代码:
namespace Harpokrat.EncryptionAlgorithms
{
// Simple substitution cypher algorithm
public class SimpleSubstitutionStrategy : IEncryptionStrategy
{
private string alphabet; // message to be encrypted
private string coded; // this will be the key (input from file or from UI)
private ArrayList AlphabetBackUp = new ArrayList();
private ArrayList CodedBackUp = new ArrayList();
#region Properties
public string Alphabet
{
get
{
return this.alphabet;
}
set
{
this.alphabet = value;
foreach (char c in this.alphabet.ToCharArray())
{
this.AlphabetBackUp.Add(c);
}
}
}
public string Coded
{
get
{
return this.coded;
}
set
{
this.coded = "yqmnnsgwatkgetwtawuiqwemsg"; //for testing purposes
foreach (char c in this.coded.ToCharArray())
{
this.CodedBackUp.Add(c);
}
}
}
#endregion
public string Decrypt(string message)
{
message = message.ToLower();
string result = "";
for (int i = 0; i < message.Length; i++)
{
int indexOfSourceChar = CodedBackUp.IndexOf(message[i]);
if (indexOfSourceChar < 0 || (indexOfSourceChar > alphabet.Length - 1))
{
result += "#";
}
else
{
result += alphabet[indexOfSourceChar].ToString();
}
}
return result;
}
public string Encrypt(string message)
{
message = message.ToLower();
string result = "";
for(int i = 0; i < message.Length; i++)
{
int indexOfSourceChar = AlphabetBackUp.IndexOf(message[i]);
if (indexOfSourceChar < 0 || (indexOfSourceChar > coded.Length - 1))
{
result += "#";
}
else
{
result += coded[indexOfSourceChar].ToString();
}
}
return result;
}
}
}
【问题讨论】:
-
如果您需要替代芯片,为什么要使用 BitArray?它在单个字符级别上运行,因此至少在字节级别上运行。请提供一些您实际加密的代码。
-
目前我正在字节级别加密。我想进一步优化它,因为我有常规和“编码”字母表的数组列表。请在已编辑的问题中找到代码。
-
使用
Dictionary是正确的方法,但不需要使用BitArray,因为您不需要在单个位级别上进行操作。使用它只会使您的代码复杂化而没有任何好处。 -
当您使用它时,我强烈建议您将那些
ArrayLists 替换为List<T>s -
alphabet和coded真的需要独立设置吗?只是它使您需要进行加密和解密的两个Dictionary<char, char>映射的初始化变得不必要地复杂。无论如何,一旦你拥有它,你应该使用一行代码来实现加密或解密(使用 LINQSelect等)。顺便说一句,我确实希望这不是为了一个教育项目——简单的替换密码被称为“简单”是有原因的!
标签: c# dictionary data-structures time-complexity hashtable