Попробуйте это регулярное выражение:
(?<=\)),\s*
Объяснение:
[1114 ]
(?<=\))
- положительный взгляд сзади, чтобы убедиться, что текущей позиции предшествует )
,\s*
- соответствует ,
, за которым следует 0+ пробелов. Затем вы можете выполнять операцию разбиения при каждом совпадении.
Я заставил бы зашифровать/подписать/дешифровать/проверить методы взять параметры для данных вместо того, чтобы иметь членские переменные для них. Наличие членских переменных для ключа и поставщика кажется хорошо все же. В основном я ожидал бы использовать тот же ключ многократно, но не те же данные.
Я также сделал бы это неизменным - делают все переменные только для чтения, беря все параметры, в которых Вы будете нуждаться для поставщиков в конструкторе вместо того, чтобы иметь отдельный метод инициализации.
Кроме того, это, кажется, хорошо переносит функциональность в более простой API для Ваших потребностей хотя, да.
Я не знаю, может ли этот надрез кода помочь Вам, я имею, написал этот код, чтобы смочь к склепу и дешифровать с частными/с открытым ключом парами в разнообразном crypting algortims, и без данных, чтобы зашифровать проблему длины, заразить реализацию RSA в.NET переносят whe, Вы пытаетесь управлять больше чем 250 (более или менее, извините я не вспоминаю), байты данных.
Я просто вырезал и вставил только необходимые методы, я также cutted xml причина документации не нахожусь на английском языке, если Вы нашли это полезным сообщенный мне, я могу отправить весь источник. Я повторяю, что не делаю протестировал эту cut&paste версию, но я использовал полную версию этого класса, который настолько не отличается.
BTW: это находится в VB, но если просто необходимо скрываться в нем, я думаю, что это достаточно ;)
Namespace Crypto
Public Class RSACry
Shared Sub New()
End Sub
Public Enum Algorithms
DES
TDES
RC2
RDAEL
End Enum
Public Shared Function Encrypt(ByVal xmlkeystring As String, ByVal typo As Algorithms, ByVal datatoencrypt As String) As String
Dim rsaer As RSA = Crypto.RSACry.ReadKeyString(xmlkeystring)
Dim result() As Byte = Crypto.RSACry.EncryptIt(rsaer, typo, datatoencrypt)
Return System.Convert.ToBase64String(result)
End Function
Public Shared Function Decrypt(ByVal xmlkeystring As String, ByVal typo As Algorithms, ByVal datatodecrypt As String) As String
Dim rsaer As RSA = Crypto.RSACry.ReadKeyString(xmlkeystring)
Dim result() As Byte = Crypto.RSACry.DecryptIt(rsaer, typo, datatodecrypt)
Return System.Text.Encoding.UTF8.GetString(result)
End Function
Friend Shared Function EncryptIt(ByRef rsaer As RSA, ByVal typo As Algorithms, ByVal datatoencrypt As String) As Byte()
Dim result() As Byte = Nothing
Try
Dim plainbytes() As Byte = System.Text.Encoding.UTF8.GetBytes(datatoencrypt)
Dim sa As SymmetricAlgorithm = SymmetricAlgorithm.Create(Crypto.RSACry.GetAlgorithmName(typo))
Dim ct As ICryptoTransform = sa.CreateEncryptor()
Dim encrypt() As Byte = ct.TransformFinalBlock(plainbytes, 0, plainbytes.Length)
Dim fmt As RSAPKCS1KeyExchangeFormatter = New RSAPKCS1KeyExchangeFormatter(rsaer)
Dim keyex() As Byte = fmt.CreateKeyExchange(sa.Key)
--return the key exchange, the IV (public) and encrypted data
result = New Byte(keyex.Length + sa.IV.Length + encrypt.Length) {}
Buffer.BlockCopy(keyex, 0, result, 0, keyex.Length)
Buffer.BlockCopy(sa.IV, 0, result, keyex.Length, sa.IV.Length)
Buffer.BlockCopy(encrypt, 0, result, keyex.Length + sa.IV.Length, encrypt.Length)
Catch ex As Exception
Throw New CryptographicException("Unable to crypt: " + ex.Message)
End Try
Return result
End Function
Friend Shared Function DecryptIt(ByRef rsaer As RSA, ByVal typo As Algorithms, ByVal datatodecrypt As String) As Byte()
Dim result() As Byte = Nothing
Try
Dim encrbytes() As Byte = System.Convert.FromBase64String(datatodecrypt)
Dim sa As SymmetricAlgorithm = SymmetricAlgorithm.Create(Crypto.RSACry.GetAlgorithmName(typo))
Dim keyex() As Byte = New Byte((rsaer.KeySize >> 3) - 1) {}
Buffer.BlockCopy(encrbytes, 0, keyex, 0, keyex.Length)
Dim def As RSAPKCS1KeyExchangeDeformatter = New RSAPKCS1KeyExchangeDeformatter(rsaer)
Dim key() As Byte = def.DecryptKeyExchange(keyex)
Dim iv() As Byte = New Byte((sa.IV.Length - 1)) {}
Buffer.BlockCopy(encrbytes, keyex.Length, iv, 0, iv.Length)
Dim ct As ICryptoTransform = sa.CreateDecryptor(key, iv)
result = ct.TransformFinalBlock(encrbytes, keyex.Length + iv.Length, (encrbytes.Length - 1) - (keyex.Length + iv.Length))
Catch ex As Exception
Throw New CryptographicException("Unable to decrypt: " + ex.Message)
End Try
Return result
End Function
Friend Shared Function GetAlgorithmName(ByVal typo As Algorithms) As String
Dim algtype As String = String.Empty
Select Case typo
Case Algorithms.DES
Return "DES"
Exit Select
Case Algorithms.RC2
Return "RC2"
Exit Select
Case Algorithms.RDAEL
Return "Rijndael"
Exit Select
Case Algorithms.TDES
Return "TripleDES"
Exit Select
Case Else
Return "Rijndael"
Exit Select
End Select
Return algtype
End Function
Friend Shared Function ReadKeyString(ByVal xmlkeystring As String) As RSA
Dim rsaer As RSA = Nothing
Try
If (String.IsNullOrEmpty(xmlkeystring)) Then Throw New Exception("Key is not specified")
rsaer = RSA.Create()
rsaer.FromXmlString(xmlkeystring)
Catch ex As Exception
Throw New CryptographicException("Unable to load key")
End Try
Return rsaer
End Function
End Namespace
Я внес некоторые корректировки, вот то, на что похожа реализация:
using System;
using System.Security.Cryptography;
namespace Agnus.Cipher
{
public class RSA : IDisposable
{
private RSACryptoServiceProvider rSAProviderThis;
private RSACryptoServiceProvider rSAProviderOther = null;
public string PublicKey
{
get { return rSAProviderThis.ToXmlString(false); }
}
public RSA()
{
rSAProviderThis = new RSACryptoServiceProvider { PersistKeyInCsp = true };
}
public void InitializeRSAProviderOther(string parameters)
{
rSAProviderOther.FromXmlString(parameters);
}
public byte[] Encrypt(byte[] plaintextBytes)
{
return rSAProviderThis.Encrypt(plaintextBytes, true);
}
public string Decrypt(byte[] ciphertextBytes)
{
try
{
return Convert.ToBase64String( rSAProviderThis.Decrypt(ciphertextBytes, true));
}
catch (CryptographicException ex)
{
Console.WriteLine("Unable to decrypt: " + ex.Message + " " + ex.StackTrace);
}
finally
{
this.Dispose();
}
return string.Empty;
}
public string SignData(byte[] ciphertextBytes)
{
string signature = GenerateSignature(ciphertextBytes, rSAProviderThis);
return signature;
}
private string GenerateSignature(byte[] ciphertextBytes, RSACryptoServiceProvider provider)
{
using (SHA1Managed SHA1 = new SHA1Managed())
{
byte[] hash = SHA1.ComputeHash(ciphertextBytes);
string signature = Convert.ToBase64String(provider.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
return signature;
}
}
public string VerifySignature(byte[] ciphertextBytes, string parameters, string signatureToVerify)
{
InitializeRSAProviderOther(parameters);
string actualSignature = GenerateSignature(ciphertextBytes, rSAProviderOther);
if (actualSignature.Equals(signatureToVerify))
{
//verification successful
string decryptedData = this.Decrypt(ciphertextBytes);
return decryptedData;
//decryptedData is a symmetric key
}
else
{
//verification unsuccessful
//end session
}
return string.Empty;
}
#region IDisposable Members
public void Dispose()
{
if (rSAProviderOther != null)
{
rSAProviderOther.Clear();
}
rSAProviderThis.Clear();
GC.SuppressFinalize(this);
}
#endregion
}
}
Вы парни все еще ничего не сказали о том, как коммуникация будет установленной (я думаю сокеты). Просветите меня.
@gogole: на самом деле я не использую сокеты, этот код используется одиноким способом рукой-bringed ключей. Однако, после того как у Вас есть свой механизм склепа, Вы больше чем при половине поездки.
Здесь существует два отсутствующих метода создать ключи, поскольку Вы запросили, чтобы код был завершен. Я надеюсь, что Вы нашли это полезным
Public Shared Sub CreateKeyPair(ByVal filename As String)
Dim xmlpublic As String = String.Empty
Dim xmlprivate As String = String.Empty
CreateKeyPair(xmlpublic, xmlprivate)
Try
Dim writer As New StreamWriter(filename + ".prv")
writer.Write(xmlprivate)
writer.Flush()
writer.Close()
Catch ex As Exception
Throw New CryptographicException("Unable to write private key file: " + ex.Message)
End Try
Try
Dim writer = New StreamWriter(filename + ".pub")
writer.Write(xmlpublic)
writer.Flush()
writer.Close()
Catch ex As Exception
Throw New CryptographicException("Unable to write public key file: " + ex.Message)
End Try
End Sub
Public Shared Sub CreateKeyPair(ByRef xmlpublic As String, ByRef xmlprivate As String)
Dim rsa As RSA = Nothing
Try
rsa.Create()
Catch ex As Exception
Throw New CryptographicException("Unable to initialize keys: " + ex.Message)
End Try
Try
xmlpublic = rsa.ToXmlString(True)
Catch ex As Exception
Throw New CryptographicException("Unable to generate public key: " + ex.Message)
End Try
Try
xmlprivate = rsa.ToXmlString(False)
Catch ex As Exception
Throw New CryptographicException("Unable to generate private key: " + ex.Message)
End Try
End Sub