Don’t trust web based secure email, one cannot verify if the delivery of a web page has been modified or not given today’s tools. A powerful adversary could MITM an HTTPS connection with a valid, signed CA cert and there are no tools today which can provably validate that the integrity of a web page has not been modified since it left the server and entered your browser. I’m trying to work on a client based solution compatible with Gmail but it’s taking me time, I keep getting distracted by other things going on. Anyway, here’s a random post in case I need a fast stream cipher similar to ARC4 but with better security.
ChaCha Python
import hashlib
class chacha:
def p(self, a, i):
return ((ord(a[i]) << 24) + (ord(a[i+1]) << 16) + (ord(a[i+2]) << 8) + ord(a[i+3]))
def r(self, a, n):
return ((a << n) & 0xffffffff) | (a >> (32 - n))
def z(self, a, b):
return ((a + b) & 0xffffffff)
def u(self, m, x, k, y):
c = ""
for i in range(0, 4):
c += chr(ord(m[x+i]) ^ ((k[y] >> (i*8)) & 0xff))
return c
def __init__(self, k, r=20):
self.pt = [0x61707865, 0x3120646e, 0x79622d36, 0x6b206574]
self.ps = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574]
self.rs = r
l = len(k)
if (l == 16):
self.skey = [
self.pt[0], self.pt[1], self.pt[2], self.pt[3],
self.p(k, 0), self.p(k, 4), self.p(k, 8), self.p(k, 12),
self.p(k, 0), self.p(k, 4), self.p(k, 8), self.p(k, 12),
0x0, 0x0, 0x0, 0x0
]
if (l == 32):
self.skey = [
self.ps[0], self.ps[1], self.ps[2], self.ps[3],
self.p(k, 0), self.p(k, 4), self.p(k, 8), self.p(k, 12),
self.p(k, 16), self.p(k, 20), self.p(k, 24), self.p(k, 28),
0x0, 0x0, 0x0, 0x0
]
def qrrd(self, x, a, b, c, d):
x[a] = self.z(x[a], x[b]); x[d] = (x[d] ^ x[a]); x[d] = self.r(x[d], 16)
x[c] = self.z(x[c], x[d]); x[b] = (x[b] ^ x[c]); x[b] = self.r(x[b], 12)
x[a] = self.z(x[a], x[b]); x[d] = (x[d] ^ x[a]); x[d] = self.r(x[d], 8)
x[c] = self.z(x[c], x[d]); x[b] = (x[b] ^ x[c]); x[b] = self.r(x[b], 7)
return x
def core(self):
x = self.skey[:]
for r in range(0, self.rs / 2):
x = self.qrrd(x, 0, 4, 8, 12)
x = self.qrrd(x, 1, 5, 9, 13)
x = self.qrrd(x, 2, 6, 10, 14)
x = self.qrrd(x, 3, 7, 11, 15)
# rows vs cols
x = self.qrrd(x, 0, 5, 10, 15)
x = self.qrrd(x, 1, 6, 11, 12)
x = self.qrrd(x, 2, 7, 8, 13)
x = self.qrrd(x, 3, 4, 9, 14)
for i in range(0, 16):
x[i] = self.z(x[i], self.skey[i])
return x
def cipher(self, m):
while ((len(m) % 64) != 0):
m += chr(0)
i = 0; l = len(m)
o = ""
while ((i + 63) < l):
s = self.core()
j = 0
while ((j + 3) < 64):
o += self.u(m, j, s, j / 4)
j += 4
self.skey[12] = self.z(self.skey[12], 1)
if (self.skey[12] == 0):
self.skey[13] += 1
i += 64
return o
c = chacha(hashlib.sha256("abc").digest())
e = c.cipher("def");print("",e)
c = chacha(hashlib.sha256("abc").digest())
d = c.cipher(e);print("",d.strip("\0"))