<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: cryptography code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 05:49:01 GMT</pubDate>
    <description>DZone Snippets: cryptography 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>Ruby HMAC verifier</title>
      <link>http://snippets.dzone.com/posts/show/2971</link>
      <description>// Ruby script to verify the HMAC of a file or string.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;#&lt;br /&gt;#  Created by Jon (exabrial+hmacruby@gmail.com) on 2006-11-04.&lt;br /&gt;#  Copyright (c) 2006. All rights reserved.&lt;br /&gt;#  Released under MIT License&lt;br /&gt;&lt;br /&gt;require 'openssl'&lt;br /&gt;require "getopt/std"&lt;br /&gt;include OpenSSL&lt;br /&gt;include Digest&lt;br /&gt;&lt;br /&gt;def printhelp&lt;br /&gt;  help=&lt;&lt;end&lt;br /&gt;Purpose: Provides HMAC-SHA1 of a file or string. Text passwords are SHA1 hashed.&lt;br /&gt;Usage: hmac.rb ["string to digest"] [-f (pathtofile)] [-k (pathtokeyfile)]&lt;br /&gt;Options:&lt;br /&gt;  -f (pathtofile) digests a file instead of a string&lt;br /&gt;  -k (pathtokeyfile) does not prompt for key and uses the specified file as a key instead.&lt;br /&gt;end&lt;br /&gt;  puts help&lt;br /&gt;  exit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if ARGV.size &lt; 1&lt;br /&gt;  printhelp&lt;br /&gt;elsif ARGV.size==1&lt;br /&gt;  @plaintext=ARGV.shift&lt;br /&gt;else&lt;br /&gt;  begin&lt;br /&gt;    opt = Getopt::Std.getopts("f:k:")&lt;br /&gt;  rescue Getopt::StdError&lt;br /&gt;    printhelp&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  if opt["f"]&lt;br /&gt;    @plaintext=File.read(opt["f"])&lt;br /&gt;  end&lt;br /&gt;  if opt["k"]&lt;br /&gt;    @key=File.read(opt["k"])&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  printhelp if (!@plaintext&amp;&amp;!@key)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def getkey&lt;br /&gt;  return @key if @key&lt;br /&gt;  print "Please type your key then push enter:"&lt;br /&gt;  return SHA1.new(gets()).to_s&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def main&lt;br /&gt;  hmacd=HMAC.new(getkey(), SHA1.new)&lt;br /&gt;  hmacd.update(@plaintext)&lt;br /&gt;  puts hmacd.to_s&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;main&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 05 Nov 2006 01:54:20 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2971</guid>
      <author>exabrial (Jon)</author>
    </item>
  </channel>
</rss>
