2

現在、uint64_t が保持できる数よりも大きな数を処理する必要がある暗号化コードを C で作成しています。(HDCP 認証を行うためのもので、暗号値の 1 つが 84 ビットです)

これを行う最良の方法は何ですか?格納する必要がある変数の 1 つが 84 ビット長です。下位 64 ビットに uint64_t を 1 つ、上位 20 ビットに uint32_t を 1 つ使用する必要がありますか? これは私にはハックのように思えますが、特に構造体に格納するためのより良い解決策があるかどうかはわかりません。

理想的な代替手段は、uint64_t のようなカスタム データ型を宣言することですが、代わりに 84 ビット長で、同じように動作します。これは可能ですか?libc がビット幅が 8 の倍数ではない変数を処理できるかどうかはわかりませんが、カスタムのビット幅データ型を宣言することがどれほど実現可能かはわかりませんが、88 ビット型はそのために機能する可能性があります。

編集: uint128_t を確認しましたが、clang の C99 モードには存在しないようです。これに対して、標準的な算術演算とビット操作を行います。これは、暗号コードに関連付けられた標準的なシバンです。

4

4 に答える 4

3

OK、32ビットのClang 3.1をインストールしたところ、これは機能します:

#include <stdio.h>

int main()
{
    unsigned __int128 i;
    printf("%d\n", sizeof(i));
}

(そして、「16」を出力します。)

于 2012-11-25T06:46:15.327 に答える
3

7 年前、私の暗号学の教授がMRACLオープン ソース ライブラリを紹介してくれました。これには、暗号化関数の非常に高速な実装と、大きな精度の数を処理するための機能が含まれていました。使い始めてかなり経ちますが、まだまだ元気そうです。問題が単に正確に 84 ビット値を表すだけで、他に何もない場合は理想的ではないかもしれませんが、より一般的な解決策になる可能性があります。

于 2012-11-25T09:15:51.077 に答える
2

64 ビットを超える必要があり、ターゲット環境に 64 ビットを超える整数型がない場合は、別のものを使用する必要があります。2 つの変数、配列、または複数のメンバーを持つ構造体を使用する必要があります。また、数値を追加する場合は plus 関数などの操作を自分で作成する必要があります。

C には、N ビット整数を簡単かつ自動的に作成する組み込みサポートはありません。

于 2012-11-25T06:56:05.057 に答える
1

GNU Multiple Precision (GMP)ライブラリはどうですか? それは任意の精度を主張します:

GMP は、符号付き整数、有理数、および浮動小数点数を操作する任意精度演算用の無料ライブラリです。GMP が実行されるマシンで使用可能なメモリによって暗示されるものを除いて、精度に実質的な制限はありません。GMP には豊富な機能セットがあり、機能には通常のインターフェイスがあります。

于 2012-11-25T07:23:40.423 に答える