linotp-decrypt-otp unrichtig Schlüssellänge

107 views
Skip to first unread message

Nicolas Videla

unread,
Jan 1, 2016, 5:52:56 PM1/1/16
to LinOTP
Hi LinOTP Team, ich habe LinOTP genutzt und ich habe nun eine Frage mit dem ,,linotp-decrypt-otp" Script. Ich will einen Token secret key dechiffrieren, dann suche ich in meine MySQL DB die erforderlich Daten:

mysql> select LinOtpKeyEnc, LinOtpKeyIV from Token;

"LinOtpKeyEnc": 
"b45a5ae13ff6a3e6938a10bd6fe42e9795ccc77933949da15e4933f76b9e7a4cd5574f951c2e76abbf2eee592ae7209312b51a2250c2d88c694e7b08255dced80e1e939637b7ee79ac7487b1f3670989bc4188a56ca7571abf8d5d7c41b8f303"

"LinOtpKeyIV": "4a2f940d1d77c8331f8b7a94e289f1c7"

Aber wenn ich führe den Script aus:

linotp-decrypt-otpkey --otp=b45a5ae13ff6a3e6938a10bd6fe42e9795ccc77933949da15e4933f76b9e7a4cd5574f951c2e76abbf2eee592ae7209312b51a2250c2d88c694e7b08255dced80e1e939637b7ee79ac7487b1f3670989bc4188a56ca7571abf8d5d7c41b8f303 --iv=4a2f940d1d77c8331f8b7a94e289f1c7 --enckey=/etc/linotp2/encKey

Traceback (most recent call last):
  File "/usr/bin/linotp-decrypt-otpkey", line 111, in <module>
    main()
  File "/usr/bin/linotp-decrypt-otpkey", line 106, in main
    result = aes_decrypt(binascii.unhexlify(otp), binascii.unhexlify(iv), enckey)
  File "/usr/bin/linotp-decrypt-otpkey", line 44, in aes_decrypt
    aesObj = AES.new(key_bin, AES.MODE_CBC, iv_bin)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 94, in new
    return AESCipher(key, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/AES.py", line 59, in __init__
    blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
    self._cipher = factory.new(key, *args, **kwargs)
ValueError: AES key must be either 16, 24, or 32 bytes long

So der encKey Schlüssel hat nicht 16, 24 oder 32 Bytes, er hat 96 Bytes länge. Das ist den Fehler.

Ich frage mich, wie dekodiert LinOTP eine OTP? 

Vielen dank für Ihre helfen!
Nicolás

Nicolas Videla

unread,
Jan 3, 2016, 1:55:50 AM1/3/16
to LinOTP
Ich habe meinen Fehler gefunden! Ich habe die erste 32 Bytes vom encKey Schlüssel benutzt, und ich habe ihm noch einmal versucht:

#python
>>>f = open('/etc/linotp2/encKey','r')
>>>g = open('/etc/linotp2/encKey2','w')
>>>g.write(f.read(32))
>>>f.close()
>>>g.close()
>>>quit()
#linotp-decrypt-otpkey --otp=b45a5ae13ff6a3e6938a10bd6fe42e9795ccc77933949da15e4933f76b9e7a4cd5574f951c2e76abbf2eee592ae7209312b51a2250c2d88c694e7b08255dced80e1e939637b7ee79ac7487b1f3670989bc4188a56ca7571abf8d5d7c41b8f303 --iv=4a2f940d1d77c8331f8b7a94e289f1c7 --enckey=/etc/linotp2/encKey2
54ae2f83178aXXXXXXXXXXXXXXXX

Dieser Secret-Key ist richtig!

Ich habe das linotp-decrypt-otpkey Script überprüft und ich habe ihm so verändert:

def main():
    try:
        opts, args = getopt(sys.argv[1:], "",
                ["help", "otp=", "iv=", "enckey="])
    except GetoptError:
        print "There is an error in your parameter syntax:"
        usage()
        sys.exit(1)

    filename = ""
    otp = ""
    iv = ""
    for opt, arg in opts:
        if opt in ('--help'):
            usage()
            sys.exit(0)
        elif opt in ('--otp'):
            otp = arg
        elif opt in ('--enckey'):
            filename = arg
        elif opt in ('--iv'):
            iv = arg

    if "" == filename or "" == otp or "" == iv:
        print "missing parameter"
        usage()
        sys.exit(1)
    f = open(filename, 'r')
    #enckey = f.read() 
    enckey = f.read(32) #First 32 Bytes of encKey
    f.close()

    result = aes_decrypt(binascii.unhexlify(otp), binascii.unhexlify(iv), enckey)
    print result

Das Script funktioniert nun mit keinen Problemen!

Vielen Dank!
Nicolás

ole...@gmail.com

unread,
Jan 22, 2016, 7:04:35 AM1/22/16
to LinOTP
Vielen dank!

Ich suchte schon für ein antwort, und Ihre vorschlag war der erste, dass ich versucht haben. Es funktioniert sehr gut!

/Ole
Reply all
Reply to author
Forward
0 new messages