C# 试图获取加密字符串的长度

C# 试图获取加密字符串的长度,c#,encryption,base64,des,C#,Encryption,Base64,Des,我正在使用以下函数加密字符串: public string Encrypt(string stringToEncrypt, string SEncryptionKey) { try { key = System.Text.Encoding.UTF8.GetBytes(Strings.Left(SEncryptionKey, 8)); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[]

我正在使用以下函数加密字符串:

public string Encrypt(string stringToEncrypt, string SEncryptionKey)
{
try {
    key = System.Text.Encoding.UTF8.GetBytes(Strings.Left(SEncryptionKey, 8));
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
    cs.Write(inputByteArray, 0, inputByteArray.Length);
    cs.FlushFinalBlock();
    return Convert.ToBase64String(ms.ToArray());
} catch (Exception e) {
    return e.Message;
    }
}

我想知道是否有某种数学算法可以让我提前确定Base64加密字符串的长度。因此,如果我的字符串长度为15个字符,那么Base64加密字符串的长度将是多少?

一个15个字符的字符串将至少是15个字节。如果有很多非ASCII字符,它可能会变成20甚至30

加密将把它四舍五入到密钥块大小的倍数,比如说64字节


然后Base64将8位字节编码为6位令牌,这样就得到(64*8)/6个令牌(字符)

是的。你可以计算一下

a) DES加密使用块。我记得是8个字节。因此,如果加密任何内容,它将四舍五入到块大小

  • 例如,您加密1个字节,它将是8个字节
  • 如果加密8个字节,它将变成8个字节
  • 加密9个字节,它将变成16个字节(适合原始数据的最小块数)
因此,格式加密长度=上限(原始长度/8)*8

b) Base64还具有与块大小非常相似的特性。它的块大小是4。每个原始3字节将转换为4字节块

因此,对于Base64encodedLength=上限(原始长度/3)*4

最后的公式是

encodedEncryptedLength=天花板(天花板(原始长度/8)*8/3)*4


originalLength这里是您计划加密的文本中的字节数(!!!不是字符!!!)。

您对成员
密钥的使用有点令人担忧。还有,你在哪里使用语句?@Jodrell——我两者都在使用。我正在对其进行DES加密,然后对其进行base64编码。@chaospandio--这是一项正在进行的工作。我的“密钥”是加密过程中最左边的8个字节key@Jodrell,不确定您的评论是什么-输入字符串,输出*DES*+base64字符串。这个问题可以有更简单的示例(去掉Base64,因为它的乘数是已知的),但即使是现在也有真正的加密。我还认为返回异常消息会使API混淆。调用方是否应该编写解析逻辑以确定是否抛出了错误?+1。对UTF8的理解很好。如果事先知道尺寸很重要-请改用UTF16。。。附带问题:DES(如果)存储原始数组大小的位置(因为它可能会更改最终大小计算)?原始大小也会以某种方式进行加密,您不会发现它有用。2Henk:您在以下几方面错了。DES的块大小为64位(不是64字节)。此外,8/6计算是粗略的近似值,因为如果编码字节数不能被3整除,Base64将添加填充。