C# 仅使用特殊字符进行加密和解密

C# 仅使用特殊字符进行加密和解密,c#,encryption,character-encoding,C#,Encryption,Character Encoding,我必须加密和解密字符串,但只能使用特殊字符 我不希望字母数字成为加密的一部分 我尝试了Rijndael加密,但只得到了一个数字输出 我怎样才能得到特殊的角色 对于特殊字符还有其他算法吗 尝试了TripleDes提供程序,结果相同,加密时是否有只选择特殊字符的算法 我有一个产品,在发货之前,我生成了包含许可证信息的序列密钥,现在当客户端激活软件时,我想加密机器名+序列密钥+主板号以生成激活密钥,现在,当我的客户打开软件时,我将解密激活密钥并验证串行密钥,以及他是否正在使用任何其他机器,我将与机器i

我必须加密和解密字符串,但只能使用特殊字符 我不希望字母数字成为加密的一部分

我尝试了Rijndael加密,但只得到了一个数字输出

我怎样才能得到特殊的角色

对于特殊字符还有其他算法吗

尝试了TripleDes提供程序,结果相同,加密时是否有只选择特殊字符的算法

我有一个产品,在发货之前,我生成了包含许可证信息的序列密钥,现在当客户端激活软件时,我想加密机器名+序列密钥+主板号以生成激活密钥,现在,当我的客户打开软件时,我将解密激活密钥并验证串行密钥,以及他是否正在使用任何其他机器,我将与机器id和主板号进行比较,因为我需要一个加密,如果可能,只包含特殊字符,直到现在它还不起作用


从十六进制输出中获取十六进制字符,将它们与一些“特殊”字符一一映射,然后映射回解密

我敢打赌这不会解决任何真正的问题。除此之外,自二战结束以来,没有多少现代加密系统使用字符而不是字节,我们只是使用字符来呈现输出


当然,这样的映射不会增加任何安全性,只会在可移植性方面造成问题。

AES/Rijndael输出的字节看起来是随机的;您将获得从0x00到0xFF的所有值。我怀疑正在发生的事情是,在某个点上,字节被转换为十六进制字符或Base64以允许显示。如果不需要字符,则将输出保留为字节数组,不进行转换


从字节到十六进制字符或Base64的转换对加密的安全性没有影响。它只允许通过需要字符数据的系统传输密码文本。

计算机是数字的。换句话说,他们处理的所有数据,包括加密输出的密文,都是离散的数字

所以,当你说输出是字母数字的时候,你实际上是在说输出的转换,而不是输出本身。只需对输出使用不同的转换。常见的转换是Base-64和十六进制,但它们不能满足您(相当奇怪)的要求;你可能得自己做决定

例如,可以用“+”和“-”字符表示密文,将它们映射到零位和一位。当然,这可能会产生一些非常长的字符串

或者,如果您可以识别16个“特殊字符”,则可以将每个字符映射到一个4位值,并使用十六进制的特殊字符,而不是数字和字母


我能问一下你到底为什么要这样做吗?

@Nitin Bourai:你可能认为你问了一个简单的问题,但实际上这是一个问得不好的问题,关于您面临的具体问题,我几乎没有详细说明。@Mitch我承认我的问题问得不好,但请再次查看您的评论您对我的个人资料发表了评论而不是对我的问题发表了评论特殊字符是指除a到z、a到z和0到之外的字符9@Mitch让我们结束这个话题,因为这个地方不会讨论这样的事情这不是一个真正的问题吗?很清楚他在问什么(至少在目前的状态下)。不要因为你不认为某人要求的是一个好的解决方案就结束一个问题。我知道这很奇怪,每个人都知道程序员的生活,只是按照顺序,试着让你成为我的助手,问题解决了我使用了编码。GetEncoding(“iso-8859-1”);,thanks@NitinBourai这不可靠。ISO-8859-1不会将字符映射到0-255之间的每个值。因此,有时您会在输出中获得额外的“?”字符,当您尝试解密时,纯文本将被破坏或解密操作将失败。此外,您将获得一些字母数字字符,我认为您希望避免这些字符。我知道没有一种字符编码能将每个字节映射到一个字符。你需要像Base-64这样的东西,或者自己设计。我正在买一些?在加密长文本和解密我收到的信息时,我可能会遇到什么问题?请你解释一下,除了Nitin Bourai以外的任何人,谁也不会听,不要只使用iso-8859-1(如果我没有弄错的话,也叫Wester Latin)的编码来映射字母字符。