|
@@ -12,14 +12,19 @@ namespace UdPunching
|
|
|
//Transfer format
|
|
|
// [0...............15] GUID Sender peer id
|
|
|
// [ gz if compressable
|
|
|
- // [15....15+ChunkSize] data encrypt by receiverPublicKey
|
|
|
- // [16+ChunkSize...END] signature of [encrypted data] of senderPrivateKey
|
|
|
+ // [15....15+BlockSize] data encrypt by receiverPublicKey
|
|
|
+ // [16+BlockSize...END] signature of [encrypted data] of senderPrivateKey
|
|
|
// ]
|
|
|
|
|
|
private const int RsaKeySize = 4096;
|
|
|
private const int BlockSize = RsaKeySize / 8;
|
|
|
|
|
|
- private static readonly MD5CryptoServiceProvider Md5 = new MD5CryptoServiceProvider();
|
|
|
+ private static readonly RSAEncryptionPadding EncryptionPadding = RSAEncryptionPadding.OaepSHA512;
|
|
|
+
|
|
|
+ private static readonly SHA512Cng SignatureHasher = new SHA512Cng();
|
|
|
+ private static readonly HashAlgorithmName SignatureHashAlgorithm = HashAlgorithmName.SHA512;
|
|
|
+ private static readonly RSASignaturePadding SignaturePadding = RSASignaturePadding.Pkcs1;
|
|
|
+
|
|
|
|
|
|
public static RSACng LoadKey(string path)
|
|
|
{
|
|
@@ -40,12 +45,12 @@ namespace UdPunching
|
|
|
byte[] pass1;
|
|
|
byte[] signature;
|
|
|
{
|
|
|
- pass1 = receiverPublicKey.Encrypt(data, RSAEncryptionPadding.OaepSHA512);// encode
|
|
|
- var hash = Md5.ComputeHash(pass1);
|
|
|
+ pass1 = receiverPublicKey.Encrypt(data, EncryptionPadding);// encode
|
|
|
+ var hash = SignatureHasher.ComputeHash(pass1);
|
|
|
using (RSA rsaCng = new RSACng())
|
|
|
{
|
|
|
rsaCng.ImportParameters(senderPrivateKey.ExportParameters(true));
|
|
|
- signature = rsaCng.SignHash(hash, HashAlgorithmName.MD5, RSASignaturePadding.Pkcs1); // signature
|
|
|
+ signature = rsaCng.SignHash(hash, SignatureHashAlgorithm, SignaturePadding); // signature
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -68,19 +73,19 @@ namespace UdPunching
|
|
|
var pass2 = Decompress(data, 16); // skip sender id
|
|
|
|
|
|
pass2.ReadBytes(BlockSize, out var enc);
|
|
|
- pass2.ReadBytes(BlockSize, out var sig, BlockSize);
|
|
|
+ pass2.ReadBytes(BlockSize, out var signature, BlockSize);
|
|
|
|
|
|
using (RSA rsaCng = new RSACng())
|
|
|
{
|
|
|
rsaCng.ImportParameters(senderPublicKey.ExportParameters(false));
|
|
|
- var hash = Md5.ComputeHash(enc);
|
|
|
- if (false == rsaCng.VerifyHash(hash, sig, HashAlgorithmName.MD5, RSASignaturePadding.Pkcs1))
|
|
|
+ var hash = SignatureHasher.ComputeHash(enc);
|
|
|
+ if (false == rsaCng.VerifyHash(hash, signature, SignatureHashAlgorithm, SignaturePadding))
|
|
|
{
|
|
|
throw new InvalidDataException("Signature verify fail");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var decodeData = receiverPrivateKey.Decrypt(enc, RSAEncryptionPadding.OaepSHA512); //decode
|
|
|
+ var decodeData = receiverPrivateKey.Decrypt(enc, EncryptionPadding); //decode
|
|
|
return decodeData;
|
|
|
}
|
|
|
|