通过RSA加密数据

时间:2014-10-01 10:54:06

标签: c# public-key-encryption

我使用这两种方法通过RSA密钥(公共和私有)加密和解密字符串值

public string EncryptString( string inputString, int dwKeySize, string xmlString )
{
    // TODO: Add Proper Exception Handlers
    RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider( dwKeySize );
    rsaCryptoServiceProvider.FromXmlString( xmlString );
    int keySize = dwKeySize / 8;
    byte[] bytes = Encoding.UTF32.GetBytes( inputString );
    // The hash function in use by the .NET RSACryptoServiceProvider here is SHA1
    // int maxLength = ( keySize ) - 2 - ( 2 * SHA1.Create().ComputeHash( rawBytes ).Length );
    int maxLength = keySize - 42;
    int dataLength = bytes.Length;
    int iterations = dataLength / maxLength;
    StringBuilder stringBuilder = new StringBuilder();
    for( int i = 0; i <= iterations; i++ )
    {
        byte[] tempBytes = new byte[ ( dataLength - maxLength * i > maxLength ) ? maxLength : dataLength - maxLength * i ];
        Buffer.BlockCopy( bytes, maxLength * i, tempBytes, 0, tempBytes.Length );
        byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt( tempBytes, true );
        // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption.
        // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors.
        // Comment out the next line and the corresponding one in the DecryptString function.
        Array.Reverse( encryptedBytes );
        // Why convert to base 64?
        // Because it is the largest power-of-two base printable using only ASCII characters
        stringBuilder.Append( Convert.ToBase64String( encryptedBytes ) );               
    }           
    return stringBuilder.ToString();
}

public string DecryptString( string inputString, int dwKeySize, string xmlString )
{
    // TODO: Add Proper Exception Handlers
    RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider( dwKeySize );
    rsaCryptoServiceProvider.FromXmlString( xmlString );
    int base64BlockSize = ( ( dwKeySize / 8 ) % 3 != 0 ) ? ( ( ( dwKeySize / 8 ) / 3 ) * 4 ) + 4 : ( ( dwKeySize / 8 ) / 3 ) * 4;
    int iterations = inputString.Length / base64BlockSize;
    ArrayList arrayList = new ArrayList();
    for( int i = 0; i < iterations; i++ )
    {
        byte[] encryptedBytes = Convert.FromBase64String( inputString.Substring( base64BlockSize * i, base64BlockSize ) );
        // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption.
        // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors.
        // Comment out the next line and the corresponding one in the EncryptString function.
        Array.Reverse( encryptedBytes );
        arrayList.AddRange( rsaCryptoServiceProvider.Decrypt( encryptedBytes, true ) );             
    }           
    return Encoding.UTF32.GetString( arrayList.ToArray( Type.GetType( "System.Byte" ) ) as byte[] );
}

但是当我用公钥加密某些文本时,加密文本会很长。例如,当我加密280个字符时,加密的文本将是大约2500个字符!!这么久......还有更好的方法吗?我想通过短信将加密文本发送到另一部手机,所以最好像3条短信一样短。任何想法?

0 个答案:

没有答案