3

PHP で短い文字列にデジタル署名し、C# で文字列の署名を検証する必要がある機能に取り組んでいます。

その単純さから、PHP でopenssl_signを使用したいと思っていますが、Google で見つけることができるすべての情報は、これが機能しないことを示しています。

これをうまく行うと主張する外部ライブラリがいくつかありますが、これは趣味のプロジェクトであるため、そのようなライブラリは購入したくありません。

では、ここでの代替手段は何ですか?C# と PHP の間の完全な相互運用性が必要です。OpenSSL 以外のライブラリも使用できます。

4

5 に答える 5

2

Bouncy Castle Crypto APIを使用して、非常によく似たことを行いました。PHP openssl_sign はデフォルトで SHA1 を使用しているようです。デフォルト以外のものを使用している場合は、GetSigner のアルゴリズム パラメータを変更する必要があります。

string base64pubkey = "<!-- BASE64 representation of your pubkey from open ssl -->";
RsaKeyParameters pubKey = PublicKeyFactory.CreateKey(Convert.FromBase64String(base64pubkey)) as RsaKeyParameters;
byte[] signature = Convert.FromBase64String("<!-- BASE64 representation of your sig -->");
byte[] message = Encoding.ASCII.GetBytes("Something that has been signed");


ISigner sig = SignerUtilities.GetSigner("SHA1WithRSAEncryption");
sig.Init(false, pubKey);
sig.BlockUpdate(message, 0, message.Length);
if (sig.VerifySignature(signature))
{
    Console.WriteLine("all good!");
}
于 2009-09-01T02:26:55.690 に答える
1

次のようにデジタル署名のsmthを確認するために使用できます。

string publicKey = "some key";
// Verifying Step 1: Create the digital signature algorithm object
DSACryptoServiceProvider verifier = new DSACryptoServiceProvider();

// Verifying Step 2: Import the signature and public key.
verifier.FromXmlString(publicKey);

// Verifying Step 3: Store the data to be verified in a byte array
FileStream file = new FileStream(args[0], FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(file2);
byte[] data = reader.ReadBytes((int)file2.Length);

// Verifying Step 4: Call the VerifyData method
if (verifier.VerifyData(data, signature))
    Console.WriteLine("Signature verified");
else
    Console.WriteLine("Signature NOT verified");
reader.Close();
file.Close();
于 2009-05-13T07:34:50.060 に答える
0

なぜ署名する必要があるのか​​について、いくつかのコンテキストが欠落しています。あなたはする必要がないかもしれません。

重要な質問は、データからどのような保証が必要かということです。

データの整合性を検証するだけでよい場合は、ハッシュがその役割を果たします。どこから来ているのかを確認する必要がある場合は、署名する必要があります。両方が必要な場合は、ハッシュし、ペイロードをハッシュと連結して、すべてに署名します。

クロスプラットフォームライブラリに関して...あなたは本当にそれについて心配する必要があるはずです。SHA1はSHA1であり、どのライブラリがそれを生成したかに関係なく、SHA1はSHA1です。デジタル署名の生成と検証についても同じことが言えます。PHPで最も簡単なものを使用し、C#で最も簡単なものを使用します。両方が正しく設定されていれば、心配する必要はありません。

于 2009-05-13T06:36:21.653 に答える
0

SSL 署名と同じくらい複雑なものが必要な理由はありますか? 文字列に MD5/SHA-1 のような単純な一方向ハッシュを使用することはできませんか? 文字列が改ざんされていないことを確認するだけであれば、それで十分です。

于 2009-05-13T06:08:34.553 に答える
0

これを見ると、この男は PHP と C# の間で非対称の署名と暗号化を行っているようです。署名は問題にならないはずです。SHA* と MD* は標準であるため、互換性がない可能性は非常に低いです (ただし、MD* と SHA1 は脆弱性のために廃止されているため、SHA256 を検討する必要があります)。

于 2009-05-13T06:13:27.057 に答える