2016-10-05 7 views
0

私はJavaでコードサンプルを用意しており、C#でも同じ機能が必要です。サンプルに使用されるクラスの代替案はありますか?C#のJava X509EncodedKeySpec

import java.math.BigInteger; 
import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.Signature; 
import java.security.spec.X509EncodedKeySpec; 
import javax.xml.bind.DatatypeConverter; 

publicKey = publicKey.replaceAll("-----(BEGIN|END).*", "").trim(); 

X509EncodedKeySpec spec = new X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(publicKey)); 
KeyFactory keyFactory = KeyFactory.getInstance("EC"); 
PublicKey pKey = keyFactory.generatePublic(spec); 

Signature ecdsaSign = Signature.getInstance("SHA256withECDSA"); 
ecdsaSign.initVerify(pKey); 
ecdsaSign.update(stringToVerify.getBytes("UTF-8")); 

if (ecdsaSign.verify(new BigInteger(ECDSA, 16).toByteArray())) { 
    // true 
} 

答えて

0

のみ公開キー構造を読むことができます(それ自体で).NETには何もありません。しかし、あなたは証明書の全体を得ることができるならば、あなたは、.NET 4.6.1に次のように書くことができます。

using System; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 
using System.Text; 

namespace Demo 
{ 
    public static class DemoClass 
    { 
     public static bool ECDsaSha256Verify(string pemCert, string data, byte[] signature) 
     { 
      using (var cert = new X509Certificate2(Encoding.ASCII.GetBytes(pemCert))) 
      using (ECDsa ecdsa = cert.GetECDsaPublicKey()) 
      { 
       if (ecdsa == null) 
       { 
        throw new ArgumentException("Certificate does not have an ECDSA key."); 
       } 

       byte[] dataBytes = Encoding.UTF8.GetBytes(data); 
       return ecdsa.VerifyData(dataBytes, signature, HashAlgorithmName.SHA256); 
      } 
     } 
    } 
} 

私は残っているように、私は、あなたのBigInteger署名値から来ていた場所がわかりませんでしたバイト配列として返されます。

+0

.net4.5に似たようなものがありますか? – petriq

+0

@petriq実際には、4.6.1でGetECDsaPublicKey(拡張)メソッドが最初に追加されました。 4.6.1は18ヶ月前にリリースされているので、うまくいけばそれに頼ることができます。 – bartonjs

+0

代わりにBouncyCastleライブラリを使用することにしました。 – petriq