2017-02-02 88 views
-1

我正在嘗試使用Python和Flask與Sagepay進行表單集成。該方法的Python使用PKCS#5填充AES MODE_CBC填充

部分是執行以下操作:

地穴領域

  1. 地穴字段應包含以純文本的所有其他交易信息作爲名稱=值字段由'分隔&'字符。確保所有必填字段都存在,並且'&'字符後沒有空格。
  2. 然後使用AES(塊大小爲128位)在CBC模式下使用PKCS#5填充使用提供的密碼作爲密鑰和初始化矢量並以十六進制編碼結果(確保字母在大寫)。
  3. Prependthe'@'signtothebeginningoftheencodedresult.*

我完全被卡住,試圖做到這一點 - 我已經建立了網址爲每這一部分:

VendorTxCode=TxCode-1310917599-223087284&Amount=36.95&Currency=GBP&Description=description&CustomerName=Fname Surname&[email protected]&BillingSurname=Surname&BillingFirstnames=Fname&BillingAddress1=BillAddress Line 1&BillingCity=BillCity&BillingPostCode=W1A 1BL&BillingCountry=GB&BillingPhone=447933000000&DeliveryFirstnames=Fname&DeliverySurname=Surname&DeliveryAddress1=BillAddress Line 1&DeliveryCity=BillCity&DeliveryPostCode=W1A 1BL&DeliveryCountry=GB&DeliveryPhone=447933000000&SuccessURL=https://example.com/success&FailureURL=https://example.com/failur e 

但現在需要使用帶有PKCS#5填充的AES MODE_CBC對其進行加密。

PHP中的示例代碼:

static public function encryptAes($string, $key) 
{ 
    // AES encryption, CBC blocking with PKCS5 padding then HEX encoding. 
    // Add PKCS5 padding to the text to be encypted. 
    $string = self::addPKCS5Padding($string); 

    // Perform encryption with PHP's MCRYPT module. 
    $crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key); 

    // Perform hex encoding and return. 
    return "@" . strtoupper(bin2hex($crypt)); 
} 

我已經試過如下:

from Crypto.Cipher import AES 
mycrptobj = AES.new('55a51621a6648525', AES.MODE_CBC, os.urandom(16)) 
ciphertext = mycryptobj.encrypt('somewords') 

,但得到的輸入字符串必須是16的長度的倍數。

所以。

我試過下面就這個其他堆棧溢出的問題,但:

  1. 我不知道IV是什麼!我正確地生成一個隨機ID嗎?重新閱讀顯示使用的關鍵是初始化矢量,我認爲是第四個是

  2. 這是正確的過程?

感謝

亞歷

+0

IV應該與加密密碼相同。 –

+0

@RikBlacow - 感謝您提供的信息,我昨晚得到了這個信息(終於!),但仍然在爲這個實際的python掙扎(包括甚至可以使用的庫)! –

回答