Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 加密失败,错误为Base-64字符数组或字符串的长度无效_Encryption_Base64_Private Key_Encryption Asymmetric - Fatal编程技术网

Encryption 加密失败,错误为Base-64字符数组或字符串的长度无效

Encryption 加密失败,错误为Base-64字符数组或字符串的长度无效,encryption,base64,private-key,encryption-asymmetric,Encryption,Base64,Private Key,Encryption Asymmetric,我正在尝试使用密码短语加密私钥,以便将文件保存到磁盘。但是加密方法引发了异常:“对于Base-64字符数组或字符串无效长度”” 加密方法是(它是2048位密钥长度): 我正在将私钥转换为Base64字符串,然后使用此方法将其传递给加密方法: public string EncodeTo64(string plainString) { var bytes = Encoding.UTF8.GetBytes(plainString);

我正在尝试使用密码短语加密
私钥
,以便将文件保存到磁盘。但是加密方法引发了异常:“
对于Base-64字符数组或字符串无效长度”

加密方法是(它是
2048位密钥长度
):

我正在将私钥转换为
Base64
字符串,然后使用此方法将其传递给加密方法:

        public string EncodeTo64(string plainString)
        {
            var bytes = Encoding.UTF8.GetBytes(plainString);
            return Convert.ToBase64String(bytes);
        }
私钥是:

<RSAKeyValue><Modulus>rhtMjLTg17sYlns4ktTow9eeuwRNra0+AO2HqESGmA8zkxe/uOv0msXzzLWUWzdPaTxi4OV+PNVPBAHW1C0CTT/33NlvipkJ1Qr5BJK1TiVZCMInshe4OL/7GNnPUPhsS6DZ/c/fnWLoxtRMUmkKgpWmtXGs7ZSoIztdJ1bgiygJWCDvrHTokVIzDaNzRonZIFk41Qt4rPofCEawjkR639OcOfazNlmU9JjvRs3ysoYghDzvVuLvJvPK7zCMzpJMQFQE7cipezXbumTqSdp20mQXJduDbD9qLKXOvcTw+2KPoNlUp+IRQrOmSf+Dl4Vxi+8+UuOH7KDLz7yL9IOPeQ==</Modulus><Exponent>AQAB</Exponent><P>2AHey3Tgg/K8M16kv6bWk1BsFGhg9xXZw2ruVhS620gyvPBtWBuOU+tzPRnEplw+Kp9jua7Nu4JkKwpQdZvRqeW42d/UCergkdNRheM3DXYj/xQNs8a1diTNe72elCsCfSHr1z/vgN+Cp+v8O4BzX07TrHeGOOP/7HWhE6setxM=</P><Q>zld05TyC/vVI2sBgaR/iYyXdUO3iIIwkGSyOmfDr1dbCKFR7btGLEsW9EpCGibyGPbAk4jA9BLU1bviBM8iH6mxWn1s4UAiIha0QSM2K9NWUPi67FELl6Fs2eLHl9qRniBhAOBCGArklail+YadKCtUsrWhfJgvO3uxkp+fg9MM=</Q><DP>sziaCmVnAxObY2PbfciHsKLBig0wptHSZHmMVo/MmbRFpM43aysx5B8u9jszFnTif6rPq3iF6lY9lhhwuaQXScf4n40++RuQSG307gmf2+Nx6mpRFCCC3wuaElk6AeXNotVKQMYjieHpHjqGhTgGgcV9i1OAYiOKbD8M7qzER1E=</DP><DQ>FEazzfLsTHF9/0D4OFxRurx1ywYVOm2K/o5KVQY/pnu8CIqEtpcQu3+C3Ngm4FIOPvGYLkHfPR8xaP4ydAw4juimenJUTkkIYVpoRz8rcHOsZY/iAlOwk+yipamVl28AXXdEmD3HbW0UKCJ7sMznkbjw8vlWoD54zZ8dJQK8MFE=</DQ><InverseQ>FUFC9v5B1mXxbbiD4WZm/KGIa3XO5+K9FwSRroj8wNMt+JY5aMS8SfUcrZMvUXfHS9+3BYXBIlxPBUm6HnfB7yPE9S0LFzRpB7APbJ0HVIlSjMS9ZdkqxShGAEufYx/FKQXomJlEXXkpgAiDnUnCR2H+ekQf1YpQUzol2KedwfA=</InverseQ><D>gEhc/s/HWyzf0QC5jnaRirs0mVdyZKVhKg3aBoF3KlMJDThSa05vzBpOqGaiCROXz1JPCKYPfYMt1SYFxA/lwkV/u5n6NYTNWcvb7yKptAqQr4Ne/Dm94xKRUJ4rwt1H7fF2rSyc9roKCXYjRhVfSRg63TYE1IjT2iHDYVkB2YVPK67O2O7YmQXeUHMRMVwXpnZCvweleRKlYbVFx2N7ZEC1TZoUn2RKsiBEem1eNSwnLa4wUf1Xl8Q8h+ziY0GnREf9JpTZhJW7f4MKsqLyOMgmoskKiIOWlnwq/b01ivB2CXFhxiiVuNUPPiMuJu6bhljeulvKl32kEzLAFxm2gQ==</D></RSAKeyValue>
显然,此Base64字符串无效,加密失败


有人知道我哪里出错了吗?

您的Base64字符串似乎有效。当我解码它时,我得到一些可识别的RSA XML:

<RSAKeyValue>
  <Modulus>rht ... PeQ==</Modulus>
  <Exponent>AQAB</Exponent>
  <P>2AH ... txM=</P>
  <Q>zld ... 9MM=</Q>
  <DP>szi ... R1E=</DP>
  <DQ>FEa ... 8MFE=</DQ>
  <InverseQ>FUF ... wfA=</InverseQ>
  <D>gEh ... m2gQ==</D>
</RSAKeyValue>

rht。。。佩克==
AQAB

2啊。。。txM=

zld。。。9毫米= 斯兹。。。R1E= 有限元。。。8MnE= 福。。。wfA= 啊。。。m2gQ==
这增加了新行,并为清晰起见进行了缩写


那是你期待的吗?如果是这样的话,我建议您检查Base64中包含的每个部分是否有错误。或者,可能是您的Base64初始片段太长。

已修复!看起来这个错误有点误导(或者可能是我太蠢了!),看起来导致异常的不是加密的纯文本,而是密码/密码短语

我在另一个应用程序中找到了使用此方法的应用程序,并发现问题的关键在于此。最初我传递一个纯文本密码,然后我将其更改为密码的SHA-256散列,而实际上这不是一个有效密钥

我添加了这两种方法(后面的方法我在这里找到):

现在,它接受纯文本密码/短语并生成一个有效的加密密钥,然后在
Encrypt
方法中使用该密钥


谢谢你们的帮助,伙计们!我现在可以安全地存储私钥了!:)

我们可以获取堆栈跟踪或异常发生的行吗?错误发生在这一行:
var aesEncryption=new RijndaelManaged{KeySize=KeySize,BlockSize=128,Mode=CipherMode.CBC,Padding=PaddingMode.PKCS7,IV=Convert.FromBase64String(Encoding.UTF8.GetString(Convert.FromBase64String(key)).Split(',)[0]),Key=Convert.FromBase64String(Encoding.UTF8.GetString(Convert.FromBase64String(Key)).Split(',')[1])
Base64文本是上面在初次提交时显示的文本。Base64字符串的长度是多少?我将私钥转换为Base64,然后尝试使用AES256对其进行加密,所以我不认为密码方法的纯文本大小有实际限制?不应该有限制,但可能有一些要求您正在使用的方法之一。首先尝试短Base64字符串,逐渐使其变长。请记住,XML字符在Base64中无效,因此,如果要解码RSA密钥中的各个部分,则需要删除它们。好的,我删除了私钥并向下传递了“TEST-VALUE”。这已转换为“VEVTVC1TVFJJTkc=”。现在的错误是“输入不是有效的Base-64字符串,因为它包含一个非Base-64字符、两个以上的填充字符或填充字符中的非法字符。”对于我来说,
vevtvc1tvfjtkc=
解码为“测试字符串”“。你需要准确地检查你正在传递的内容。例如,它的开头是否有一些UTF-8字符。我怀疑有什么东西进入了你的字符串并导致Base64消化不良。抱歉!!输入错误-这是测试字符串。”。
PFJTQUtleVZhbHVlPjxNb2R1bHVzPnJodE1qTFRnMTdzWWxuczRrdFRvdzllZXV3Uk5yYTArQU8ySHFFU0dtQTh6a3hlL3VPdjBtc1h6ekxXVVd6ZFBhVHhpNE9WK1BOVlBCQUhXMUMwQ1RULzMzTmx2aXBrSjFRcjVCSksxVGlWWkNNSW5zaGU0T0wvN0dOblBVUGhzUzZEWi9jL2ZuV0xveHRSTVVta0tncFdtdFhHczdaU29JenRkSjFiZ2l5Z0pXQ0R2ckhUb2tWSXpEYU56Um9uWklGazQxUXQ0clBvZkNFYXdqa1I2MzlPY09mYXpObG1VOUpqdlJzM3lzb1lnaER6dlZ1THZKdlBLN3pDTXpwSk1RRlFFN2NpcGV6WGJ1bVRxU2RwMjBtUVhKZHVEYkQ5cUxLWE92Y1R3KzJLUG9ObFVwK0lSUXJPbVNmK0RsNFZ4aSs4K1V1T0g3S0RMejd5TDlJT1BlUT09PC9Nb2R1bHVzPjxFeHBvbmVudD5BUUFCPC9FeHBvbmVudD48UD4yQUhleTNUZ2cvSzhNMTZrdjZiV2sxQnNGR2hnOXhYWncycnVWaFM2MjBneXZQQnRXQnVPVSt0elBSbkVwbHcrS3A5anVhN051NEprS3dwUWRadlJxZVc0MmQvVUNlcmdrZE5SaGVNM0RYWWoveFFOczhhMWRpVE5lNzJlbENzQ2ZTSHIxei92Z04rQ3ArdjhPNEJ6WDA3VHJIZUdPT1AvN0hXaEU2c2V0eE09PC9QPjxRPnpsZDA1VHlDL3ZWSTJzQmdhUi9pWXlYZFVPM2lJSXdrR1N5T21mRHIxZGJDS0ZSN2J0R0xFc1c5RXBDR2lieUdQYkFrNGpBOUJMVTFidmlCTThpSDZteFduMXM0VUFpSWhhMFFTTTJLOU5XVVBpNjdGRUxsNkZzMmVMSGw5cVJuaUJoQU9CQ0dBcmtsYWlsK1lhZEtDdFVzcldoZkpndk8zdXhrcCtmZzlNTT08L1E+PERQPnN6aWFDbVZuQXhPYlkyUGJmY2lIc0tMQmlnMHdwdEhTWkhtTVZvL01tYlJGcE00M2F5c3g1Qjh1OWpzekZuVGlmNnJQcTNpRjZsWTlsaGh3dWFRWFNjZjRuNDArK1J1UVNHMzA3Z21mMitOeDZtcFJGQ0NDM3d1YUVsazZBZVhOb3RWS1FNWWppZUhwSGpxR2hUZ0dnY1Y5aTFPQVlpT0tiRDhNN3F6RVIxRT08L0RQPjxEUT5GRWF6emZMc1RIRjkvMEQ0T0Z4UnVyeDF5d1lWT20ySy9vNUtWUVkvcG51OENJcUV0cGNRdTMrQzNOZ200RklPUHZHWUxrSGZQUjh4YVA0eWRBdzRqdWltZW5KVVRra0lZVnBvUno4cmNIT3NaWS9pQWxPd2sreWlwYW1WbDI4QVhYZEVtRDNIYlcwVUtDSjdzTXpua2Jqdzh2bFdvRDU0elo4ZEpRSzhNRkU9PC9EUT48SW52ZXJzZVE+RlVGQzl2NUIxbVh4YmJpRDRXWm0vS0dJYTNYTzUrSzlGd1NScm9qOHdOTXQrSlk1YU1TOFNmVWNyWk12VVhmSFM5KzNCWVhCSWx4UEJVbTZIbmZCN3lQRTlTMExGelJwQjdBUGJKMEhWSWxTak1TOVpka3F4U2hHQUV1Zll4L0ZLUVhvbUpsRVhYa3BnQWlEblVuQ1IySCtla1FmMVlwUVV6b2wyS2Vkd2ZBPTwvSW52ZXJzZVE+PEQ+Z0VoYy9zL0hXeXpmMFFDNWpuYVJpcnMwbVZkeVpLVmhLZzNhQm9GM0tsTUpEVGhTYTA1dnpCcE9xR2FpQ1JPWHoxSlBDS1lQZllNdDFTWUZ4QS9sd2tWL3U1bjZOWVROV2N2Yjd5S3B0QXFRcjROZS9EbTk0eEtSVUo0cnd0MUg3ZkYyclN5Yzlyb0tDWFlqUmhWZlNSZzYzVFlFMUlqVDJpSERZVmtCMllWUEs2N08yTzdZbVFYZVVITVJNVndYcG5aQ3Z3ZWxlUktsWWJWRngyTjdaRUMxVFpvVW4yUktzaUJFZW0xZU5Td25MYTR3VWYxWGw4UThoK3ppWTBHblJFZjlKcFRaaEpXN2Y0TUtzcUx5T01nbW9za0tpSU9XbG53cS9iMDFpdkIyQ1hGaHhpaVZ1TlVQUGlNdUp1NmJobGpldWx2S2wzMmtFekxBRnhtMmdRPT08L0Q+PC9SU0FLZXlWYWx1ZT4=
<RSAKeyValue>
  <Modulus>rht ... PeQ==</Modulus>
  <Exponent>AQAB</Exponent>
  <P>2AH ... txM=</P>
  <Q>zld ... 9MM=</Q>
  <DP>szi ... R1E=</DP>
  <DQ>FEa ... 8MFE=</DQ>
  <InverseQ>FUF ... wfA=</InverseQ>
  <D>gEh ... m2gQ==</D>
</RSAKeyValue>
            public static string AesKeyFromPassword(string password, int keySize = Keysize.SymmetricKeyLength)
        {
            byte[] passwordByteArray = CreateKey(password);

            var aesEncryption = new RijndaelManaged
            {
                KeySize = keySize,
                BlockSize = 128,
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                Key = passwordByteArray
            };

            aesEncryption.GenerateIV();
            string ivStr = Convert.ToBase64String(aesEncryption.IV);
            string keyStr = Convert.ToBase64String(aesEncryption.Key);
            string completeKey = ivStr + "," + keyStr;

            return Convert.ToBase64String(Encoding.UTF8.GetBytes(completeKey));
        }

        private static byte[] CreateKey(string password)
        {
            var salt = new byte[] { 1, 2, 23, 234, 37, 48, 134, 63, 248, 4 };

            const int Iterations = 9872;
            using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, Iterations))
                return rfc2898DeriveBytes.GetBytes(32);
        }