2013-05-31 260 views
1

我試圖使用密碼加密PRIVATE KEY,以便將文件保存到磁盤。但加密方法拋出異常:「Invalid length for a Base-64 char array or string」。加密失敗,出現錯誤Base-64字符數組或字符串的長度無效

的加密方法是(這是一個2048bit key length):

    public static string Encrypt(string plainString, string key, int keySize = Keysize.SymmetricKeyLength) 
       { 
        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]) 
        }; 

        byte[] plainText = Encoding.UTF8.GetBytes(plainString); 
        ICryptoTransform crypto = aesEncryption.CreateEncryptor(); 
        // The result of the encryption and decryption    
        byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length); 

        return Convert.ToBase64String(cipherText); 
       } 

我私鑰轉換爲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> 

和由此產生的Bas從上面的轉換方法e64字符串是:

PFJTQUtleVZhbHVlPjxNb2R1bHVzPnJodE1qTFRnMTdzWWxuczRrdFRvdzllZXV3Uk5yYTArQU8ySHFFU0dtQTh6a3hlL3VPdjBtc1h6ekxXVVd6ZFBhVHhpNE9WK1BOVlBCQUhXMUMwQ1RULzMzTmx2aXBrSjFRcjVCSksxVGlWWkNNSW5zaGU0T0wvN0dOblBVUGhzUzZEWi9jL2ZuV0xveHRSTVVta0tncFdtdFhHczdaU29JenRkSjFiZ2l5Z0pXQ0R2ckhUb2tWSXpEYU56Um9uWklGazQxUXQ0clBvZkNFYXdqa1I2MzlPY09mYXpObG1VOUpqdlJzM3lzb1lnaER6dlZ1THZKdlBLN3pDTXpwSk1RRlFFN2NpcGV6WGJ1bVRxU2RwMjBtUVhKZHVEYkQ5cUxLWE92Y1R3KzJLUG9ObFVwK0lSUXJPbVNmK0RsNFZ4aSs4K1V1T0g3S0RMejd5TDlJT1BlUT09PC9Nb2R1bHVzPjxFeHBvbmVudD5BUUFCPC9FeHBvbmVudD48UD4yQUhleTNUZ2cvSzhNMTZrdjZiV2sxQnNGR2hnOXhYWncycnVWaFM2MjBneXZQQnRXQnVPVSt0elBSbkVwbHcrS3A5anVhN051NEprS3dwUWRadlJxZVc0MmQvVUNlcmdrZE5SaGVNM0RYWWoveFFOczhhMWRpVE5lNzJlbENzQ2ZTSHIxei92Z04rQ3ArdjhPNEJ6WDA3VHJIZUdPT1AvN0hXaEU2c2V0eE09PC9QPjxRPnpsZDA1VHlDL3ZWSTJzQmdhUi9pWXlYZFVPM2lJSXdrR1N5T21mRHIxZGJDS0ZSN2J0R0xFc1c5RXBDR2lieUdQYkFrNGpBOUJMVTFidmlCTThpSDZteFduMXM0VUFpSWhhMFFTTTJLOU5XVVBpNjdGRUxsNkZzMmVMSGw5cVJuaUJoQU9CQ0dBcmtsYWlsK1lhZEtDdFVzcldoZkpndk8zdXhrcCtmZzlNTT08L1E+PERQPnN6aWFDbVZuQXhPYlkyUGJmY2lIc0tMQmlnMHdwdEhTWkhtTVZvL01tYlJGcE00M2F5c3g1Qjh1OWpzekZuVGlmNnJQcTNpRjZsWTlsaGh3dWFRWFNjZjRuNDArK1J1UVNHMzA3Z21mMitOeDZtcFJGQ0NDM3d1YUVsazZBZVhOb3RWS1FNWWppZUhwSGpxR2hUZ0dnY1Y5aTFPQVlpT0tiRDhNN3F6RVIxRT08L0RQPjxEUT5GRWF6emZMc1RIRjkvMEQ0T0Z4UnVyeDF5d1lWT20ySy9vNUtWUVkvcG51OENJcUV0cGNRdTMrQzNOZ200RklPUHZHWUxrSGZQUjh4YVA0eWRBdzRqdWltZW5KVVRra0lZVnBvUno4cmNIT3NaWS9pQWxPd2sreWlwYW1WbDI4QVhYZEVtRDNIYlcwVUtDSjdzTXpua2Jqdzh2bFdvRDU0elo4ZEpRSzhNRkU9PC9EUT48SW52ZXJzZVE+RlVGQzl2NUIxbVh4YmJpRDRXWm0vS0dJYTNYTzUrSzlGd1NScm9qOHdOTXQrSlk1YU1TOFNmVWNyWk12VVhmSFM5KzNCWVhCSWx4UEJVbTZIbmZCN3lQRTlTMExGelJwQjdBUGJKMEhWSWxTak1TOVpka3F4U2hHQUV1Zll4L0ZLUVhvbUpsRVhYa3BnQWlEblVuQ1IySCtla1FmMVlwUVV6b2wyS2Vkd2ZBPTwvSW52ZXJzZVE+PEQ+Z0VoYy9zL0hXeXpmMFFDNWpuYVJpcnMwbVZkeVpLVmhLZzNhQm9GM0tsTUpEVGhTYTA1dnpCcE9xR2FpQ1JPWHoxSlBDS1lQZllNdDFTWUZ4QS9sd2tWL3U1bjZOWVROV2N2Yjd5S3B0QXFRcjROZS9EbTk0eEtSVUo0cnd0MUg3ZkYyclN5Yzlyb0tDWFlqUmhWZlNSZzYzVFlFMUlqVDJpSERZVmtCMllWUEs2N08yTzdZbVFYZVVITVJNVndYcG5aQ3Z3ZWxlUktsWWJWRngyTjdaRUMxVFpvVW4yUktzaUJFZW0xZU5Td25MYTR3VWYxWGw4UThoK3ppWTBHblJFZjlKcFRaaEpXN2Y0TUtzcUx5T01nbW9za0tpSU9XbG53cS9iMDFpdkIyQ1hGaHhpaVZ1TlVQUGlNdUp1NmJobGpldWx2S2wzMmtFekxBRnhtMmdRPT08L0Q+PC9SU0FLZXlWYWx1ZT4= 

顯然這個Base64字符串是無效的,加密失敗。

任何人都可以看到我要去哪裏嗎?

+0

我們可以得到堆棧跟蹤或發生異常的行嗎?在這條線發生 – DarkSquirrel42

+0

錯誤: 'VAR aesEncryption =新RijndaelManaged的 { 密鑰大小=密鑰大小, BLOCKSIZE = 128, 模式= CipherMode.CBC, 填充= PaddingMode.PKCS7, IV = Convert.FromBase64String(編碼。 UTF8.GetString(Convert.FromBase64String(key)).Split(',')[0]), Key = Convert.FromBase64String(Encoding.UTF8.GetString(Convert.FromBase64String(key))。Split(',')[1]) };' –

+0

Base64文本是以上在首次提交中顯示的文本。 –

回答

0

固定!看起來這個錯誤有點誤導(或者我可能是愚蠢的!),它看起來不是用於加密的純文本,而是密碼/密碼短語的例外原因。

我發現另一個應用程序,我在使用這種方法,發現鑰匙是問題。我最初傳遞一個純文本密碼,然後當這實際上不是一個有效密鑰時,我將其更改爲密碼的SHA-256散列。

我添加了這兩種方法(其中我發現這裏的版本):

  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); 
     } 

這就是現在發生的明文密碼/短語,併產生一個有效的加密密鑰,然後我在Encrypt方法使用。

感謝您的幫助!我現在可以安全地存儲私鑰了! :)

0

您的Base64字符串看起來是有效的。當我解碼它,我得到一些可識別XML的RSA:

<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> 

這增加了換行和縮寫爲清晰。

那是你所期待的嗎?如果是的話,我建議你檢查每個包含的Base64的錯誤。另外,它可能只是你的最初一塊Base64太長了。

+0

Base64字符串的長度是多少?我將PRIVATE KEY轉換爲base64,然後嘗試使用AES256對其進行加密,所以我沒有對密碼方法的純文本大小進行實際限制? –

+0

不應該有任何限制,但是您正在使用的其中一種方法可能有一些要求。首先嚐試使用短的Base64字符串進行實驗,逐漸讓它們變長。請記住,XML字符在Base64中無效,因此如果要解碼RSA密鑰中的各個部分,則需要將其刪除。 – rossum

+0

好吧,我刪除了私鑰,並向下傳遞了「TEST-VALUE」。這轉換爲「VEVTVC1TVFJJTkc =」。現在錯誤是「輸入不是有效的Base-64字符串,因爲它包含非基本64字符,多於兩個填充字符或填充字符中的非法字符。」 –

相關問題