-
-
Save Zakrevskijj/bb99703c9f1abecbc00625e9d98f2f01 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.IO; | |
using System.Security.Cryptography; | |
using System.Text; | |
using Org.BouncyCastle.Asn1; | |
using Org.BouncyCastle.Asn1.CryptoPro; | |
using Org.BouncyCastle.Asn1.Pkcs; | |
using Org.BouncyCastle.Asn1.Sec; | |
using Org.BouncyCastle.Asn1.X509; | |
using Org.BouncyCastle.Asn1.X9; | |
using Org.BouncyCastle.Crypto; | |
using Org.BouncyCastle.Crypto.Digests; | |
using Org.BouncyCastle.Crypto.Operators; | |
using Org.BouncyCastle.Crypto.Parameters; | |
using Org.BouncyCastle.Math; | |
using Org.BouncyCastle.OpenSsl; | |
using Org.BouncyCastle.Pkcs; | |
using Org.BouncyCastle.Security; | |
using Org.BouncyCastle.Utilities.Encoders; | |
using Org.BouncyCastle.X509; | |
using RestSharp; | |
namespace MonoTest | |
{ | |
class Program | |
{ | |
//private static string PROVIDER_NAME = BouncyCastleProvider.PROVIDER_NAME; | |
private static string EC_PARAMS_NAME = "secp256k1"; | |
private static string SIGNATURE_NAME = "SHA-256withECDSA"; | |
private static string ALG_KEY_NAME = "ECDSA"; | |
private static string ALG_KEY_ID_NAME = "SHA1"; | |
static void Main(string[] args) | |
{ | |
Console.WriteLine("Hello World!"); | |
String privateKeyEncoded = | |
"-----BEGIN EC PARAMETERS-----\n" + | |
"BgUrgQQACg==\n" + | |
"-----END EC PARAMETERS-----\n" + | |
"-----BEGIN EC PRIVATE KEY-----\n" + | |
"MHQCAQEEIM0pAucaFp+dgJATEUtJdA1GB3j6oB42a4NSBBWnY+UvoAcGBSuBBAAK\n" + | |
"oUQDQgAE8bHXw5UsMKneBO2OxeMKCaeECRwHy028OApMYzvdJwUKHQZCUznzUlpj\n" + | |
"PrRa7884jkrHXLl3DH8W3EOCiKzoEA==\n" + | |
"-----END EC PRIVATE KEY-----\n"; | |
var privKeySolo = "MHQCAQEEIM0pAucaFp+dgJATEUtJdA1GB3j6oB42a4NSBBWnY+UvoAcGBSuBBAAK\n" + | |
"oUQDQgAE8bHXw5UsMKneBO2OxeMKCaeECRwHy028OApMYzvdJwUKHQZCUznzUlpj\n" + | |
"PrRa7884jkrHXLl3DH8W3EOCiKzoEA==\n"; | |
String url = "/personal/auth/request"; | |
String permissions = "ps"; | |
String time = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); | |
String message = time + permissions + url; | |
var pemReader = new PemReader(new StringReader(privateKeyEncoded)); | |
var oid = pemReader.ReadPemObject(); | |
var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject(); | |
var tmp = Asn1Object.FromByteArray(oid.Content); | |
var privKey = keyPair.Private; | |
var privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privKey); | |
//var obj1 = privateKeyInfo.ParsePrivateKey().ToAsn1Object(); | |
//var privateKeyInfo1 = new PrivateKeyInfo(privateKeyInfo.PrivateKeyAlgorithm, obj1); | |
//var seq = Asn1Sequence.GetInstance(privateKeyInfo.ToAsn1Object()); | |
//var seq1 = Asn1Sequence.GetInstance(Asn1Object.FromByteArray(privateKeyInfo1.GetDerEncoded())); | |
//var seq2 = Asn1Sequence.GetInstance(privateKeyInfo.ToAsn1Object()); | |
IEnumerator objects = seq.GetEnumerator(); | |
objects.MoveNext(); | |
objects.MoveNext(); | |
var algId = (AlgorithmIdentifier)objects.Current; | |
objects.MoveNext(); | |
var dataS = ((DerOctetString)objects.Current); | |
//var data = dataS.GetDerEncoded(); | |
//var info = new Pkcs8EncryptedPrivateKeyInfo(new EncryptedPrivateKeyInfo(algId, data)); | |
//var btss = info.GetEncryptedData(); | |
//var privateKey = PrivateKeyFactory.CreateKey(btss); | |
var data1 = privateKeyInfo.GetDerEncoded(); | |
Console.WriteLine(BitArrayToString(data1)); | |
var data12 = privateKeyInfo.GetEncoded(); | |
Console.WriteLine(BitArrayToString(data12)); | |
var info1 = new Pkcs8EncryptedPrivateKeyInfo(new EncryptedPrivateKeyInfo(algId, data1)); | |
var btss1 = info1.GetEncoded(); | |
var kInfo = Asn1Object.FromByteArray(btss1); | |
var seqT = Asn1Sequence.GetInstance(kInfo); | |
IEnumerator objects1 = seqT.GetEnumerator(); | |
objects1.MoveNext(); | |
var algId12 = (Asn1Sequence)objects1.Current; | |
objects1.MoveNext(); | |
var dataS1 = (DerOctetString)objects1.Current; | |
IEnumerator objects12 = algId12.GetEnumerator(); | |
objects12.MoveNext(); | |
var algId1 = (DerObjectIdentifier)objects12.Current; | |
objects12.MoveNext(); | |
var algId2 = (DerObjectIdentifier)objects12.Current; | |
var kInfo1 = new PrivateKeyInfo(algId, dataS1); | |
var tt = new ECPrivateKeyStructure( | |
Asn1Sequence.GetInstance(kInfo1.GetDerEncoded())); | |
Console.WriteLine(algId.Algorithm.Equals(X9ObjectIdentifiers.IdECPublicKey)); | |
Console.WriteLine(algId2.Equals(X9ObjectIdentifiers.ECDsaWithSha256)); | |
Console.WriteLine(algId2.Equals(X9ObjectIdentifiers.EllipticCurve)); | |
Console.WriteLine(algId2.Equals(SecObjectIdentifiers.SecP256k1)); | |
var privateKey = PrivateKeyFactory.CreateKey(kInfo1); | |
//var data2 = dataS.GetEncoded(); | |
//var info2 = new Pkcs8EncryptedPrivateKeyInfo(new EncryptedPrivateKeyInfo(algId, data2)); | |
//var btss2 = info2.GetEncryptedData(); | |
//var privateKey2 = PrivateKeyFactory.CreateKey(btss2); | |
//byte[] pkcs8EncodedBytes = Base64.Decode(privKeySolo); | |
//var privateKey = PrivateKeyFactory.CreateKey(pkcs8EncodedBytes); | |
//var privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keyPair.Private); | |
//var obj = privateKeyInfo.ParsePrivateKey(); | |
//var ttt=new Pkcs8EncryptedPrivateKeyInfo(privateKeyInfo) | |
//var info=ttt.Build(new Asn1CipherBuilderWithKey(privateKeyInfo.PrivateKeyAlgorithm.Algorithm, 256, new SecureRandom())); | |
//var pkcs = new Pkcs8EncryptedPrivateKeyInfo(keyPair.Content); | |
//var privateKey = PrivateKeyFactory.CreateKey(privateKeyInfo.GetEncoded()); | |
//var privateKey11 = PrivateKeyFactory.CreateKey(pkcs12.GetEncryptedData()); | |
//var bts122 = privateKeyInfo.GetEncoded(); | |
//var pkcs1 = new Pkcs8EncryptedPrivateKeyInfo(bts122); | |
//var privateKey1 = PrivateKeyFactory.CreateKey(pkcs1.GetEncryptedData()); | |
//var privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keyPair.Private); | |
//var bts123 = privateKeyInfo.GetDerEncoded(); | |
//var privateKey = PrivateKeyFactory.CreateKey(bts123); | |
//var btsA = privateKeyInfo.GetDerEncoded(); | |
//var privateKeyA = PrivateKeyFactory.CreateKey(btsA); | |
//PrivateKeyInfo privateKeyInfoA = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyA); | |
//var privateKeyA1 = PrivateKeyFactory.CreateKey(privateKeyInfoA.GetDerEncoded()); | |
byte[] msgBytes, signature, sign; | |
string signAsBase64 = GetSignature(message, privateKey, out msgBytes, out signature, out sign); | |
var tmPubStr = | |
"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8bHXw5UsMKneBO2OxeMKCaeECRwHy028OApMYzvdJwUKHQZCUznzUlpjPrRa7884jkrHXLl3DH8W3EOCiKzoEA=="; | |
var tmpPub = PublicKeyFactory.CreateKey(Convert.FromBase64String(tmPubStr)); | |
ISigner signerV = SignerUtilities.GetSigner(SIGNATURE_NAME); | |
signerV.Init(false, tmpPub); | |
signerV.BlockUpdate(msgBytes, 0, msgBytes.Length); | |
var valid = signerV.VerifySignature(signature); | |
var valid1 = signerV.VerifySignature(sign); | |
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(tmpPub); | |
var bts1 = publicKeyInfo.GetDerEncoded(); | |
var publicKey1 = PublicKeyFactory.CreateKey(bts1); | |
SubjectPublicKeyInfo publicKeyInfo1 = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey1); | |
var bts = publicKeyInfo1.PublicKeyData.GetBytes(); | |
var hash = HashAlgorithm.Create(ALG_KEY_ID_NAME); | |
var ee = hash.ComputeHash(bts); | |
var keyId = BitArrayToString(ee).ToLowerInvariant(); | |
var client = new RestClient("https://api.monobank.ua/"); | |
var request = new RestRequest(Method.GET); | |
request.AddHeader("X-Key-Id", keyId); | |
request.AddHeader("X-Permissions", permissions); | |
request.AddHeader("X-Time", time); | |
request.AddHeader("X-Sign", signAsBase64); | |
request.AddHeader("X-Request-Id", "sdsdsfsdfsf"); | |
request.Resource = url; | |
var response = client.Execute(request); | |
Console.WriteLine(BitArrayToString(ee)); | |
///** Получить Public Key */ | |
String spki = Base64.ToBase64String(publicKeyInfo.GetEncoded()); | |
Console.WriteLine(spki); | |
Console.WriteLine(tmPubStr); | |
} | |
private static string GetSignature(string message, AsymmetricKeyParameter privateKey, out byte[] msgBytes, out byte[] signature, out byte[] sign) | |
{ | |
ISigner signer = SignerUtilities.GetSigner(SIGNATURE_NAME); | |
signer.Init(true, privateKey); | |
msgBytes = Encoding.UTF8.GetBytes(message); | |
var ttttt = Encoding.Unicode.GetBytes(message); | |
var msgBytes2 = Encoding.ASCII.GetBytes(message); | |
signer.BlockUpdate(msgBytes, 0, msgBytes.Length); | |
signature = signer.GenerateSignature(); | |
int EC_POINT_LEN = 32; | |
Asn1Sequence sequence = Asn1Sequence.GetInstance(Asn1Object.FromByteArray(signature)); | |
IEnumerator objects = sequence.GetEnumerator(); | |
objects.MoveNext(); | |
byte[] r = ((DerInteger)objects.Current).Value.ToByteArray(); | |
objects.MoveNext(); | |
byte[] s = ((DerInteger)objects.Current).Value.ToByteArray(); | |
sign = new byte[EC_POINT_LEN * 2]; | |
int offSet = r.Length - EC_POINT_LEN; | |
if (offSet < 0) | |
{ | |
Array.Copy(r, 0, sign, -offSet, r.Length); | |
} | |
else | |
{ | |
Array.Copy(r, offSet, sign, 0, EC_POINT_LEN); | |
} | |
offSet = s.Length - EC_POINT_LEN; | |
if (offSet < 0) | |
{ | |
Array.Copy(s, 0, sign, EC_POINT_LEN - offSet, s.Length); | |
} | |
else | |
{ | |
Array.Copy(s, offSet, sign, EC_POINT_LEN, EC_POINT_LEN); | |
} | |
return Convert.ToBase64String(sign); | |
} | |
public static string BitArrayToString(byte[] ba) | |
{ | |
return BitConverter.ToString(ba).Replace("-", string.Empty); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment