OpenSSL win 下報錯 OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink


python 中使用 M2Crypto 想讀寫文件時總是報:
OPENSSL_Uplink(58D46000,08): no OPENSSL_Applink
windows 平台下使用 openssl 時不能直接操作與文件 IO 有關的函數。 
因為 ms/uplink.c 會動態從當前 exe 中獲取 ms/applink.c 的函數表,邏輯是
void OPENSSL_Uplink (volatile void **table, int index)
{
HANDLE h = GetModuleHandle(NULL)
GetProcAddress(h,"OPENSSL_Applink")
}
。如果想使用,則必須在鏈接 exe 時候也鏈接 ms/uplink.c。
 
當 python 使用 M2Crypto 時,如果操作文件,可先創建一個 MemoryBuffer 的 BIO 對象, 然后將 MemoryBuffer 讀取為字符串,手動將字符串寫入文件。
print "Generating a 1024 bit private/public key pair for Bob..."
Bob = M2Crypto.RSA.gen_key (1024, 65537)

if os.name == 'nt':
    mb = M2Crypto.BIO.MemoryBuffer()
    Bob.save_key_bio(mb, None)
    with open('Bob-private.pem', 'wb') as f:
        f.write(mb.read_all())
else:
    Bob.save_key ('Bob-private.pem', None)

 讀時順序相反,先讀為字符串,然后創建 MemoryBuffer 的 BIO 對象,接着用 BIO 創建所需對象

if os.name == 'nt':
    mb = None
    with open('Bob-private.pem', 'rb') as f:
        mb = M2Crypto.BIO.MemoryBuffer(f.read())

    if mb:
        Bob = M2Crypto.RSA.load_key_bio(mb)
    else:
        print 'error load key'
else:
    Bob = M2Crypto.RSA.load_key('Bob-private.pem')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM