私は暗号に関連するプロジェクトを行っています。でコードをビルドしていますpython
。ただし、暗号関数はPBC
計算に C ライブラリを使用します。したがって、適切な関数を含む C プログラムを作成し、それを共有ライブラリとしてコンパイルしました。を使用してライブラリをインポートしますctypes
。これまでのところ、すべて順調です。
私が今直面している問題は、unsigned char
宣言された変数をライブラリでグローバル変数として取得する必要があり、Python ソケットを介して別の受信 Python ソケットに送信する必要があることunsigned char
です。
今、unsigned char
ライブラリから を取得しようとすると、
ibc = cdll.LoadLibrary('./libibc.so.1.0.1')
strin = 'some string'
ibc.init_pairing(1, 1, 1)# Initializing the lib
ibc.read_share()
id_str = (c_char * 40)()
id_str.value = strin
ibc.hash_id_s(id_str) # Passing a char to a function
hsid = (c_ubyte * 1000)()
hsid = c_ubyte.in_dll(ibc, "hid")
ibc.gen_privatekey(hsid, 1, 3) #pass unsigned char to function
最後の行は、セグメンテーション違反で終わります。そこでgen_privatekey
、次のコードを使用して、c 自体から関数を呼び出しました。
int genprkey(){
unsigned char key[100];
element_to_bytes(key, pks);
gen_privatekey(key, 1, 2);
}
次に、次を使用して python からこの関数を呼び出します。
ibc.genprkey()
そしてプログラムは成功します。
問題
上記の関数はunsigned char
、別のグローバル変数にも格納される を生成します。このように変数を取得しようとしました:
hsidp = (c_char_p)()
hsidp = c_char_p.in_dll(ibc, "hid")
Pythonインタープリターで上記のコードを試しました。入力すると:
hsidp
出力は次のとおりです。
c_char_p(10598250801977757708)
しかし、私が入力すると:
hsidp.value
を取得しsegmentation fault (core dumped)
ます。変数の処理方法が正しくないと思われます。Python で変数としてを取得したら、unsigned char
それを別のソケットにメッセージとして送信し、それを読み取ってunsigned char
同じライブラリに an として渡す必要があります。
これがどのように可能になるかはわかりません。助けてください