aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/rc4.py
diff options
context:
space:
mode:
authorLibravatarAgustin Henze <tin@sluc.org.ar>2013-05-30 17:41:06 -0300
committerLibravatarAgustin Henze <tin@sluc.org.ar>2013-05-30 17:41:06 -0300
commit0c4dfdec5b55b6064dccc38bbfb0a7c0699c895a (patch)
treea6707225ccc559f7edf50ddd3fdc7fc85145c921 /nikola/rc4.py
parent8b14a1e5b2ca574fdd4fd2377567ec98a110d4b6 (diff)
Imported Upstream version 5.4.4
Diffstat (limited to 'nikola/rc4.py')
-rw-r--r--nikola/rc4.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/nikola/rc4.py b/nikola/rc4.py
new file mode 100644
index 0000000..6e63474
--- /dev/null
+++ b/nikola/rc4.py
@@ -0,0 +1,76 @@
+"""
+ Copyright (C) 2012 Bo Zhu http://about.bozhu.me
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+"""
+
+import base64
+import sys
+
+
+def KSA(key):
+ keylength = len(key)
+
+ S = list(range(256))
+
+ j = 0
+ for i in range(256):
+ j = (j + S[i] + key[i % keylength]) % 256
+ S[i], S[j] = S[j], S[i] # swap
+
+ return S
+
+
+def PRGA(S):
+ i = 0
+ j = 0
+ while True:
+ i = (i + 1) % 256
+ j = (j + S[i]) % 256
+ S[i], S[j] = S[j], S[i] # swap
+
+ K = S[(S[i] + S[j]) % 256]
+ yield K
+
+
+def RC4(key):
+ S = KSA(key)
+ return PRGA(S)
+
+
+def rc4(key, string):
+ """Encrypt things.
+ >>> print(rc4("Key", "Plaintext"))
+ u/MW6NlArwrT
+ """
+
+ string.encode('utf8')
+ key.encode('utf8')
+
+ def convert_key(s):
+ return [ord(c) for c in s]
+ key = convert_key(key)
+ keystream = RC4(key)
+ r = b''
+ for c in string:
+ if sys.version_info[0] == 3:
+ r += bytes([ord(c) ^ next(keystream)])
+ else:
+ r += chr(ord(c) ^ next(keystream))
+ return base64.b64encode(r).replace(b'\n', b'').decode('ascii')