暗号化は、データの閲覧や変更を防止するのに役立ち、安全でないチャネル上で安全な通信手段を提供するのに役立ちます。たとえば、データは暗号化アルゴリズムを使用して暗号化され、暗号化された状態で送信され、その後、目的の受信者によって復号化されます。暗号化されたデータが第三者に傍受された場合、データを復号することは困難になります。
これらの目標を達成するには、暗号化プリミティブと呼ばれるアルゴリズムと規則の組み合わせを使用して暗号化スキームを作成します。秘密キー暗号化 (対称暗号化)、公開キー暗号化 (非対称暗号化)、暗号署名、および暗号ハッシュが含まれます。
登録コードアルゴリズムの実装には公開キー暗号化(非対称暗号化)を使用します。
公開キー暗号化では、権限のないユーザーに対して秘密にしておく必要がある秘密キーと、誰にでも公開できる公開キーを使用します。公開キーと秘密キーは両方とも数学的に関連しており、公開キーで暗号化されたデータは秘密キーでのみ復号化でき、秘密キーで署名されたデータは公開キーでのみ検証できます。
登録コードの場合、秘密キーを使用して文字列 (ユーザー名) に署名し、公開キーを使用して署名 (登録コード) を検証します。公開キーは検証にのみ使用できるため、公開キーを安心して配布できます。秘密キーは署名に使用されるため、秘密キーは開発者の手元に保管する必要があります。このようにして、登録認証の目的は達成されます。 「ユーザー名、登録コード」モードを使用して現在登録されているすべてのソフトウェアは、このテクノロジーを使用する必要があります。
まず、使用する公開キーと秘密キーを生成します。
新しい Security.Cryptography.RSACryptoServiceProvider としてのプライベート rsa
RSACryptoServiceProvider クラスは、非対称暗号化と復号化を実行するための RSA アルゴリズムの実装を提供します。必要な公開キーと秘密キーは、ToXMLString を通じて生成できます。
rsa.ToXmlString(False)
rsa.ToXmlString(True)
パラメータが False の場合は公開キーのみが生成され、True の場合は公開キーと秘密キーの両方が生成されます。通常、公開キー文字列は ToXmlString(False) を通じて取得し、秘密キー文字列は ToXmlString(True) を通じて取得します (公開キーが含まれています)。これら 2 つのキーをローカル マシンに保存し、文字列定数を通じて定義して使用できます。つまり、登録情報には一意の公開キーと秘密キーが使用されます。
次に、指定された文字列に公開キーと秘密キーを使用して署名します。
rsa.FromXmlString(PRIVATE_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)
Dim sha As New Security .Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(result)
SerialNumber = Convert.ToBase64String(regkey)
取得した秘密キーで rsa オブジェクトを再初期化します。 、その後、RSAPKCS1SignatureFormatter クラスを通じて署名が実行されます。入力文字列をバイト配列に変換し (ここでのデフォルトのユーザー名は ASCII 文字のみで構成できます)、SHA1 ハッシュ アルゴリズムを通じてそのハッシュ値を計算します。次に、CreateSignature メソッドを使用して、取得したハッシュ値に署名します。最後に、取得したバイト配列を登録コードとして文字列に変換します。これは登録コードを生成するプロセスです。このプログラムを再利用して、さまざまなユーザー名に署名し、それに対応するさまざまな登録コードを取得できます。
最後に、取得したユーザー名と登録コードを確認します。
rsa.FromXmlString(PUBLIC_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() As Byte = Convert.FromBase64String(SerialNumber)
Dim sha As New Security.Cryptography.SHA1Managed
Dim name () As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Result = f.VerifySignature(name, key)
今回は、公開鍵を使用して rsa オブジェクトを初期化し、署名を検証します。 RSAPKCS1SignatureDeformatter クラスを通じて。取得した登録コードをバイト配列に逆変換し、ユーザー名をハッシュ計算してハッシュ値を取得します。最後に、VerifySignature を通じて検証します。
上記のプログラムからわかるように、登録コードを生成するには秘密キーが必要です (秘密キーには公開キー情報が伴います)。ユーザー名と登録コードのペアはいくつでも生成できます。公開キーを使用すると、検証のみが可能ですが、生成はできません。したがって、公開キーは検証のためにすべてのユーザーに安全に配布できますが、秘密キーは配布できません。したがって、公開キーと検証アルゴリズムはリリースされたバージョンに含めることができます。ユーザーが公開鍵と検証アルゴリズムを入手したとしても、簡単に解読できないためです。
現在、インターネット上で普及している登録マシンの多くは、ソフトウェアの秘密キーを解読し、必要な登録情報を無制限に生成することができます。ただし、ユーザーが製品を逆コンパイルして中間コードを変更すると、登録判定ロジックがバイパスされます。これはこの記事で解決できる問題ではありません。なぜなら、Web サービス技術を使用してオンラインでのアクティベーションや登録を行ったとしても、ネットワーク リスニングを通じてサーバー情報を分析し、偽のサーバーをシミュレートすることができるからです。
http://www.cnblogs.com/farrio/archive/2006/12/01/579296.html