[utils] Add OHDave's RSA encryption function

This commit is contained in:
Yen Chi Hsuan 2016-02-17 06:01:44 +08:00
parent 958759f44b
commit 5bc880b988
2 changed files with 26 additions and 0 deletions

View file

@ -35,6 +35,7 @@ from youtube_dl.utils import (
is_html, is_html,
js_to_json, js_to_json,
limit_length, limit_length,
ohdave_rsa_encrypt,
OnDemandPagedList, OnDemandPagedList,
orderedSet, orderedSet,
parse_duration, parse_duration,
@ -792,6 +793,13 @@ The first line
{'nocheckcertificate': False}, '--check-certificate', 'nocheckcertificate', 'false', 'true', '='), {'nocheckcertificate': False}, '--check-certificate', 'nocheckcertificate', 'false', 'true', '='),
['--check-certificate=true']) ['--check-certificate=true'])
def test_ohdave_rsa_encrypt(self):
N = 0xab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd
e = 65537
self.assertEqual(
ohdave_rsa_encrypt(b'aa111222', e, N),
'726664bd9a23fd0c70f9f1b84aab5e3905ce1e45a584e9cbcf9bcc7510338fc1986d6c599ff990d923aa43c51c0d9013cd572e13bc58f4ae48f2ed8c0b0ba881')
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -4,6 +4,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import base64 import base64
import binascii
import calendar import calendar
import codecs import codecs
import contextlib import contextlib
@ -2582,3 +2583,20 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
return None # No Proxy return None # No Proxy
return compat_urllib_request.ProxyHandler.proxy_open( return compat_urllib_request.ProxyHandler.proxy_open(
self, req, proxy, type) self, req, proxy, type)
def ohdave_rsa_encrypt(data, exponent, modulus):
'''
Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/
Input:
data: data to encrypt, bytes-like object
exponent, modulus: parameter e and N of RSA algorithm, both integer
Output: hex string of encrypted data
Limitation: supports one block encryption only
'''
payload = int(binascii.hexlify(data[::-1]), 16)
encrypted = pow(payload, exponent, modulus)
return '%x' % encrypted