3

一意のハードウェア ID (CPU ID、イーサネット MAC アドレス、またはハードディスクのシリアル番号) に基づいてシリアル番号を生成するための簡単なスキーム/アルゴリズムを取得したいと考えています。

スキームが一方向にのみ機能するようにしたいので、クライアント マシン上のアプリケーションはシリアル番号を確認できますが、シリアル番号を生成することはできません。(したがって、クラックするのは簡単ではありません)。

おそらくほとんどの人は、RSA 公開鍵と秘密鍵のペアの暗号化を推奨するでしょう。これは十分に確実に機能します。クライアントは RSA 秘密鍵を持っていないため、シリアル番号を「生成」できません。

しかし、RSA 署名の主な問題は、大きすぎることです。署名のサイズは、RSA キーのサイズ ( RSA 署名のサイズ? )に応じて 128 または 256 バイトです。

  • シリアル番号をメールから登録フォームへの単純なコピーペーストにしたいので、最大64文字、理想的には32バイトです。

さて、あなたはおそらく、この種の保護は総当りの種類のハッキングに対して十分ではないと言うでしょう - 正しいシリアル番号を決定するためにすべての組み合わせを試すだけです.

しかし、通常、このようなブルー​​ト フォース クラッキング アプリケーションを作成するには、「高価な」ハッカーまたはハッカー チームを雇う必要があると言えます。

また、次のバージョンのアプリケーションでシリアル番号生成アルゴリズムを変更したり、マルチラウンド パスを使用してブルート フォースを劇的に遅くしたりすることも可能だと思います。

ベースとして、プレーン C または C++ (C# ではない)、できれば Windows / wincrypt.h または既存のプレーン C ソースコード (できれば巨大なサードパーティライブラリではない) を使用することをお勧めします。

署名のサイズが 32 文字になるように RSA 公開鍵と秘密鍵のペアを作成することはできますか?

4

3 に答える 3

4

ECDSAをチェックしてみてください。

ECDSA は RSA のような公開鍵アルゴリズムですが、RSA よりも鍵と署名のサイズが短く、同じレベルの効果的なセキュリティを提供します。ECDSA は、楕円曲線暗号に基づいています。RSA で使われる整数因数分解問題も、ECDSA で使われる楕円曲線も離散対数問題に帰着するため、解くのが難しいとされています。

たとえば、約 80 ビットのセキュリティがあると推定される 1024 ビットの RSA と同じセキュリティ レベルの場合、320 ビットの署名を生成する 160 ビットの ECDSA キーを使用できます。320 ビットの署名を base64 で 54 文字の文字列にエンコードするか、ascii85 で 50 文字の文字列にエンコードできます。

または、最大 192 ビットのデータを保持できる base64 エンコーディングで 32 文字を維持したい場合は、鍵サイズが 96 ビットの ECDSA を使用できます。96 ビット ECDSA の有効な強度は 48 ビットであり、これは通常、適切な暗号化には十分な強度ではありませんが、あなたのケースでは、攻撃者がプログラムをリバース エンジニアリングしてライセンス キー チェックを削除するよりも、ライセンス キー チェックを削除する方が簡単な場合があります。偽造キーを生成します。

于 2016-02-25T12:05:54.210 に答える
1

このフォーラムで現在提案されているECDSA秘密/公開鍵ペアを使用し、ここで質問した双方向暗号化アルゴリズムの使用を含む独自のソリューションを投稿することにしました: 貧乏人のシリアル番号生成スキーム、一部2

コードにはまだいくつかのバグが含まれている可能性がありますが、最善を尽くし、できる限りすべてをテストしようとしました。

また、マネージ コード部分と C# コードを使用して C++ コードをテストしますが、実装によっては、マネージ部分を完全に削除したい場合があります。

ここでは回答のサイズが制限されているため、コードを外部 URL に配置する必要がありました。そのため、回答のサイズは十分に小さくなります。

ここに私のコードスニペットがあります:

3 番目のコードは不完全です。これは、どのようにコーディングできるかを示した単なるデモ コードです。C# を使用しない場合、上位層は別のものになる可能性があります。

EDSCA 署名アルゴリズムについては、https://github.com/esxgx/easy-eccを少し修正して使用しました - 署名のサイズを短くするため:

/* Curve selection options. */
#define secp128r1 16

#ifndef ECC_CURVE
    #define ECC_CURVE secp128r1
#endif
  • 可能な限り小さい署名サイズ。

コードをチェックアウトし始めると、公開鍵と秘密鍵のペアが初期化されていないことに気付くでしょう。それらは私の製品にしっかりとバインドされているからです。しかし、ここにいくつかのデモ キーを投稿させてください (現在のコードを使用してそれらを初期化しました)。

unsigned char publicKey[] = {
    0x03, 0x7A, 0x0E, 0xE4, 0x2C, 0xC1, 0x29, 0x1D, 0x22, 0xCF, 0x6F, 0xCE, 0x03, 0x5F, 0xBF, 0x31, 0xDD, 
};
unsigned char encryptedPrivateKey[] = {
    0x9E, 0x8C, 0x4C, 0x8F, 0x02, 0x1D, 0x7E, 0x34, 0xA0, 0xDB, 0xBC, 0x45, 0xD8, 0x1A, 0x57, 0x7A, 
};

したがって、現在の公開鍵と秘密鍵のペア - ハードウェア ID 000000000000 (ネットワーク カードの MAC アドレスから取得) の場合 - 次のシリアル キーが有効です。

pc000000000000-NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=

これには、署名部分 ("pc000000000000") と署名自体 ("NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=") が含まれるようになりました。

ここからの最良の部分は、公開鍵と秘密鍵を含む、私のソリューションの完全なソース コードを入手できることです。不足しているのは、管理者の秘密鍵を暗号化するために使用したパスワードですが、それがないとシリアル番号を生成できません。私は今、このソリューションをハッキングするためにハッカーに挑戦しています - 私のソフトウェアにシリアルキージェネレーターを作成してください。非常に興味深いジレンマです。完全なソース コードがありますが、それは役に立ちません。:-)

ソフトウェアをクラッキングすることはまだ可能だと思います (Asm のジャンプ ショート、操作なし) が、これはいつでも実行できるものです。

目標は、シリアル キー生成のためのシンプルで小さくてきれいなソリューション (ある製品から別の製品にコピー ペーストするだけのソリューション) を導入することによって、ハッカーの生活を少し難しくすることです。

于 2016-03-05T22:00:37.417 に答える