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"))