<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: crypto code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 05:49:01 GMT</pubDate>
    <description>DZone Snippets: crypto code</description>
    <item>
      <title>Diffie-Hellman key exchange in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4600</link>
      <description>From: http://labs.musecurity.com/2007/05/09/diffie-hellman-in-ruby/&lt;br /&gt;Author: kowsik&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;class Integer&lt;br /&gt;    # Compute self ^ e mod m&lt;br /&gt;    def mod_exp e, m&lt;br /&gt;        result = 1&lt;br /&gt;        b = self&lt;br /&gt;        while e &gt; 0&lt;br /&gt;            result = (result * b) % m if e[0] == 1&lt;br /&gt;            e = e &gt;&gt; 1&lt;br /&gt;            b = (b * b) % m&lt;br /&gt;        end&lt;br /&gt;        return result&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # A roundabout, slow but fun way of counting bits.&lt;br /&gt;    def bits_set&lt;br /&gt;        ("%b" % self).count('1')&lt;br /&gt;        #to_s(2).count('1')   # alternative&lt;br /&gt;        #count = 0         # alternative&lt;br /&gt;        #byte = self.abs&lt;br /&gt;        #count += byte &amp; 1 and byte &gt;&gt;= 1 until byte == 0     # cf. http://snippets.dzone.com/posts/show/4233&lt;br /&gt;        #count&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class DH&lt;br /&gt;    attr_reader :p, :g, :q, :x, :e&lt;br /&gt;&lt;br /&gt;    # p is the prime, g the generator and q order of the subgroup&lt;br /&gt;    def initialize p, g, q&lt;br /&gt;        @p = p&lt;br /&gt;        @g = g&lt;br /&gt;        @q = q&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # generate the [secret] random value and the public key&lt;br /&gt;    def generate tries=16&lt;br /&gt;        tries.times do&lt;br /&gt;            @x = rand(@q)&lt;br /&gt;            @e = self.g.mod_exp(@x, self.p)&lt;br /&gt;            return @e if self.valid?&lt;br /&gt;        end&lt;br /&gt;        raise ArgumentError, "can't generate valid e"&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # validate a public key&lt;br /&gt;    def valid? _e = self.e&lt;br /&gt;        _e and _e.between?(2, self.p-2) and _e.bits_set &gt; 1&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # compute the shared secret, given the public key&lt;br /&gt;    def secret f&lt;br /&gt;        f.mod_exp(self.x, self.p)&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;alice = DH.new(53, 5, 23)&lt;br /&gt;bob   = DH.new(53, 5, 15)&lt;br /&gt;alice.generate&lt;br /&gt;bob.generate&lt;br /&gt;&lt;br /&gt;alice_s = alice.secret(bob.e)&lt;br /&gt;bob_s   = bob.secret(alice.e)&lt;br /&gt;puts alice_s&lt;br /&gt;puts bob_s&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Mon, 01 Oct 2007 18:39:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4600</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>HashFunction.py</title>
      <link>http://snippets.dzone.com/posts/show/2888</link>
      <description>&lt;code&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="21 Dec 2005 - 17 Jul 2006"&lt;br /&gt;__copyright__="Copyright 2006 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.3"&lt;br /&gt;__URL__="http://snippets.dzone.com/posts/show/2888"&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;from getopt import getopt&lt;br /&gt;&lt;br /&gt;TEST_MODE="TEST"&lt;br /&gt;HASH_MODE="HASH"&lt;br /&gt;&lt;br /&gt;class HashFunction:&lt;br /&gt;	"""Base class for hash functions"""&lt;br /&gt;&lt;br /&gt;	# bytes&lt;br /&gt;	BLOCK_SIZE=1&lt;br /&gt;	DIGEST_SIZE=1&lt;br /&gt;&lt;br /&gt;	INIT=0x00&lt;br /&gt;	SUM_REQ="Sum &gt;= 0"&lt;br /&gt;&lt;br /&gt;	TEST_DATA="abc"&lt;br /&gt;	TEST_HASH=0x26&lt;br /&gt;&lt;br /&gt;	def __init__(self, sum=0x00):&lt;br /&gt;		"""Sets the context to some initial sum"""&lt;br /&gt;		self.sum=sum&amp;0xff&lt;br /&gt;&lt;br /&gt;	def sumValid(self, sum):&lt;br /&gt;		return sum&gt;=0&lt;br /&gt;&lt;br /&gt;	def _update(self, b):&lt;br /&gt;		"""Data is an array of bytes"""&lt;br /&gt;&lt;br /&gt;		self.sum=(self.sum+b)&amp;0xff&lt;br /&gt;&lt;br /&gt;	def update(self, data):&lt;br /&gt;		"""Helper for _update(). Data is a string."""&lt;br /&gt;&lt;br /&gt;		for byte in data:&lt;br /&gt;			self._update(ord(byte))&lt;br /&gt;&lt;br /&gt;	def digest(self):&lt;br /&gt;		"""Returns an integer or long integer"""&lt;br /&gt;&lt;br /&gt;		return self.sum&lt;br /&gt;&lt;br /&gt;	def formatDigest(self):&lt;br /&gt;		"""Returns a formatted string, different for each algorithm"""&lt;br /&gt;&lt;br /&gt;		return "%02x" % (self.digest())&lt;br /&gt;&lt;br /&gt;	def unformatDigest(self, hash):&lt;br /&gt;		"""Converts formatted hash into integer"""&lt;br /&gt;&lt;br /&gt;		return int(hash, 16)&lt;br /&gt;&lt;br /&gt;	def reset(self):&lt;br /&gt;		"""Reinitializes the hash"""&lt;br /&gt;&lt;br /&gt;		self.__init__()&lt;br /&gt;&lt;br /&gt;	def test(self):&lt;br /&gt;		self.reset()&lt;br /&gt;		self.update(self.TEST_DATA)&lt;br /&gt;		hash=self.digest()&lt;br /&gt;		formattedHash=self.formatDigest()&lt;br /&gt;		unformattedHash=self.unformatDigest(formattedHash)&lt;br /&gt;&lt;br /&gt;		if unformattedHash==self.TEST_HASH:&lt;br /&gt;			return "OK"&lt;br /&gt;&lt;br /&gt;		return [self.TEST_DATA, hash, formattedHash, unformattedHash, self.TEST_HASH]&lt;br /&gt;&lt;br /&gt;def usage(script=sys.argv[0]):&lt;br /&gt;	print "Usage: %s [options] &lt;file1 file2 file3 ... &gt;" % (script)&lt;br /&gt;	print "\n-s --sum &lt;sum&gt;"&lt;br /&gt;	print "-t --test engine"&lt;br /&gt;	print "-h --help usage"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def main(hasher=HashFunction, script="HashFunction.py"):&lt;br /&gt;	global TEST_MODE&lt;br /&gt;	global HASH_MODE&lt;br /&gt;&lt;br /&gt;	systemArgs=sys.argv[1:] # ignore program name&lt;br /&gt;&lt;br /&gt;	mode=HASH_MODE&lt;br /&gt;	sum=hasher.INIT&lt;br /&gt;&lt;br /&gt;	optlist, args=[], []&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt(systemArgs, "s:th", ["sum=", "test", "help"])&lt;br /&gt;	except Exception, e:&lt;br /&gt;		usage(script)&lt;br /&gt;&lt;br /&gt;	if len(optlist)&lt;1 and len(args)&lt;1:&lt;br /&gt;		usage(script)&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-h" or option=="--help":&lt;br /&gt;			usage(script)&lt;br /&gt;		elif option=="-t" or option=="--test":&lt;br /&gt;			mode=TEST_MODE&lt;br /&gt;		elif option=="-s" or option=="--sum":&lt;br /&gt;			try:&lt;br /&gt;				sum=hasher.unformatDigest(value)&lt;br /&gt;				if not hasher.sumValid(sum):&lt;br /&gt;					raise Exception&lt;br /&gt;			except Exception, e:&lt;br /&gt;				raise "Requires: %s" % (hasher.SUM_REQ)&lt;br /&gt;&lt;br /&gt;	hasher=hasher()&lt;br /&gt;&lt;br /&gt;	if mode==TEST_MODE:&lt;br /&gt;		print hasher.test()&lt;br /&gt;	elif mode==HASH_MODE:&lt;br /&gt;		for file in args:&lt;br /&gt;			f=None&lt;br /&gt;			try:&lt;br /&gt;				f=open(file, "rb")&lt;br /&gt;			except Exception, e:&lt;br /&gt;				print "Could not open %s" % (file)&lt;br /&gt;			else:&lt;br /&gt;				hasher.reset()&lt;br /&gt;				for line in f:&lt;br /&gt;					hasher.update(line)&lt;br /&gt;				f.close()&lt;br /&gt;&lt;br /&gt;				print hasher.formatDigest()&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	main(HashFunction, "HashFunction.py")&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 25 Oct 2006 07:04:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2888</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
  </channel>
</rss>
