Skip to content

Commit a17031a

Browse files
author
nahi
committed
import rubykaigi2006
0 parents  commit a17031a

File tree

96 files changed

+2054
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+2054
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'rake/clean'
2+
3+
CLEAN.include('*.bin')
4+
5+
task :default => 'seckey.bin'
6+
7+
file 'seckey.bin' do
8+
load 'generatekey.rb'
9+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'openssl'
2+
3+
# load SECRET key
4+
key = File.read("seckey.bin")
5+
6+
# create AES engine
7+
cipher = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
8+
9+
# initialize
10+
cipher.decrypt
11+
cipher.key = key
12+
13+
# decryption
14+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
require 'openssl'
2+
3+
# load SECRET key
4+
key = File.read("seckey.bin")
5+
6+
# create AES engine
7+
# 128/192/256 must match key length (bits)
8+
cipher = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
9+
10+
# initialize
11+
cipher.encrypt
12+
cipher.key = key
13+
14+
# encryption
15+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'openssl'
2+
3+
puts 'create 128 bit random key for AES'
4+
key = OpenSSL::Random.random_bytes(128/8)
5+
6+
File.open("seckey.bin", "wb") do |file|
7+
file << key
8+
end
9+
puts 'wrote seckey.bin'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'rake/clean'
2+
3+
CLEAN.include('*.bin')
4+
5+
task :default => 'seckey.bin'
6+
7+
file 'seckey.bin' do
8+
load 'generatekey.rb'
9+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'openssl'
2+
3+
# load SECRET key
4+
key = File.read("seckey.bin")
5+
6+
# create AES engine
7+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
8+
9+
# load iv from the begining of cipher
10+
iv = ARGF.read(16)
11+
12+
# initialize
13+
cipher.decrypt
14+
cipher.key = key
15+
cipher.iv = iv
16+
17+
# decryption
18+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
require 'openssl'
2+
3+
# load SECRET key
4+
key = File.read("seckey.bin")
5+
6+
# create AES engine
7+
# 128/192/256 must match key length (bits)
8+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
9+
10+
# create IV(initial vector)
11+
# 16 bytes == 128 bits is a block length
12+
# AES is a 128 bit block cipher
13+
iv = OpenSSL::Random.random_bytes(16)
14+
15+
# initialize
16+
cipher.encrypt
17+
cipher.key = key
18+
cipher.iv = iv
19+
20+
# iv is needed for decryption
21+
print iv
22+
23+
# encryption
24+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'openssl'
2+
3+
puts 'create 256 bit random key for AES'
4+
key = OpenSSL::Random.random_bytes(256/8)
5+
6+
File.open("seckey.bin", "wb") do |file|
7+
file << key
8+
end
9+
puts 'wrote seckey.bin'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require 'rake/clean'
2+
3+
CLEAN.include('*.bin')
4+
CLEAN.include('password.txt')
5+
6+
task :default => 'password.txt'
7+
8+
file 'password.txt' do
9+
puts 'type password'
10+
File.open('password.txt', 'wb') do |file|
11+
file << STDIN.gets
12+
end
13+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
require 'openssl'
2+
3+
# load password
4+
password = File.read("password.txt")
5+
6+
# create AES engine
7+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
8+
9+
# initialize
10+
cipher.decrypt
11+
# calc key and IV from password
12+
cipher.pkcs5_keyivgen(password)
13+
14+
# decryption
15+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
require 'openssl'
2+
3+
# load password
4+
password = File.read("password.txt")
5+
6+
# create AES engine
7+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
8+
9+
# initialize
10+
cipher.encrypt
11+
# calc key and IV from password
12+
cipher.pkcs5_keyivgen(password)
13+
14+
# encryption
15+
print cipher.update(ARGF.read) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
require 'openssl'
2+
3+
# it's just a proof of concept
4+
5+
# RSA public key calculation
6+
# c = m ^ e (mod n)
7+
def rsa_public(input, n, e)
8+
input_bn = OpenSSL::BN.new(input.to_s)
9+
n_bn = OpenSSL::BN.new(n.to_s)
10+
e_bn = OpenSSL::BN.new(e.to_s)
11+
(input_bn.mod_exp(e_bn, n_bn)).to_i
12+
end
13+
14+
# RSA private key calculation
15+
# s = m ^ d (mod n)
16+
def rsa_private(input, n, d)
17+
input_bn = OpenSSL::BN.new(input.to_s)
18+
n_bn = OpenSSL::BN.new(n.to_s)
19+
d_bn = OpenSSL::BN.new(d.to_s)
20+
(input_bn.mod_exp(d_bn, n_bn)).to_i
21+
end
22+
23+
# test key
24+
e = 3
25+
d = 7
26+
n = 33
27+
28+
# encryption and decryption sample
29+
plain = 13
30+
p ['plain', plain]
31+
32+
# sender knows n and e (PUBLIC key)
33+
cipher = rsa_public(plain, n, e)
34+
p ['cipher', cipher]
35+
36+
# receiver knows n and d (PRIVATE key)
37+
decrypted = rsa_private(cipher, n, d)
38+
p ['decrypted', decrypted]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'rake/clean'
2+
3+
CLEAN.include('*.bin')
4+
CLEAN.include('*.pem')
5+
6+
task :default => ['privkey.pem', 'pubkey.pem']
7+
8+
file 'pubkey.pem' do
9+
load 'generatekey.rb'
10+
end
11+
12+
file 'privkey.pem' do
13+
load 'generatekey.rb'
14+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'openssl'
2+
3+
# load PRIVATE key
4+
privkey =
5+
OpenSSL::PKey::RSA.new(File.read("privkey.pem"))
6+
7+
# decryption
8+
print privkey.private_decrypt(ARGF.read)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require 'openssl'
2+
3+
# load PUBLIC key
4+
pubkey =
5+
OpenSSL::PKey::RSA.new(File.read("pubkey.pem"))
6+
7+
# encryption
8+
# CAUTION: ARGF must be shorter than key size!
9+
print pubkey.public_encrypt(ARGF.read)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require 'openssl'
2+
3+
STDOUT.sync = true
4+
puts 'creating 2048 bits RSA keypair...'
5+
key = OpenSSL::PKey::RSA.new(2048) { print "." }
6+
puts 'done'
7+
8+
File.open("privkey.pem", "w") do |file|
9+
file << key.to_pem
10+
end
11+
puts 'wrote privkey.pem'
12+
13+
File.open("pubkey.pem", "w") do |file|
14+
file << key.public_key.to_pem
15+
end
16+
puts 'wrote pubkey.pem'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../115_rsa/Rakefile
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'openssl'
2+
3+
# load encrypted password and encrypted text
4+
cipherpassword, ciphertext =
5+
Marshal.load(ARGF), Marshal.load(ARGF)
6+
7+
# decrypt password with RSA
8+
privkey =
9+
OpenSSL::PKey::RSA.new(File.read("privkey.pem"))
10+
password = privkey.private_decrypt(cipherpassword)
11+
12+
# decrypt password with AES
13+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
14+
cipher.decrypt
15+
cipher.pkcs5_keyivgen(password)
16+
17+
# dump
18+
print cipher.update(ciphertext) + cipher.final
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require 'openssl'
2+
3+
# create password for AES
4+
password = OpenSSL::Random.random_bytes(16)
5+
6+
# encrypt source with AES
7+
cipher = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
8+
cipher.encrypt
9+
cipher.pkcs5_keyivgen(password)
10+
ciphertext =
11+
cipher.update(ARGF.read) + cipher.final
12+
13+
# encrypt password with RSA
14+
pubkey =
15+
OpenSSL::PKey::RSA.new(File.read("pubkey.pem"))
16+
cipherpassword = pubkey.public_encrypt(password)
17+
18+
# dump
19+
print Marshal.dump(cipherpassword) +
20+
Marshal.dump(ciphertext)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../115_rsa/generatekey.rb
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../116_rsa+aes/Rakefile
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../116_rsa+aes/decrypt.rb
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../116_rsa+aes/encrypt.rb
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'openssl'
2+
3+
STDOUT.sync = true
4+
puts 'creating 2048 bits RSA keypair...'
5+
key = OpenSSL::PKey::RSA.new(2048) { print "." }
6+
puts 'done'
7+
8+
File.open("privkey.pem", "w") do |file|
9+
# protect key with a password
10+
protectedkey = key.export(OpenSSL::Cipher::Cipher.new("AES-256-CBC"))
11+
12+
# for protecting with a given password
13+
# protectedkey = key.export(
14+
# OpenSSL::Cipher::Cipher.new("AES-256-CBC"),
15+
# "my password")
16+
17+
# for custom password callback:
18+
# require 'password_callback'
19+
# protectedkey = key.export(
20+
# OpenSSL::Cipher::Cipher.new("AES-256-CBC"),
21+
# &PasswordCallback)
22+
23+
file << protectedkey
24+
end
25+
puts 'wrote privkey.pem with password protection'
26+
27+
File.open("pubkey.pem", "w") do |file|
28+
file << key.public_key.to_pem
29+
end
30+
puts 'wrote pubkey.pem'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
PasswordCallback = lambda { |for_encryption|
2+
print "Enter password: "
3+
pass = $stdin.gets.chop!
4+
if pass.length < 4
5+
$stderr.puts "password must be longer than 4 bytes"
6+
raise
7+
end
8+
if for_encryption
9+
print "Verify password: "
10+
pass2 = $stdin.gets.chop!
11+
if pass != pass2
12+
$stderr.puts "password does not match"
13+
raise
14+
end
15+
end
16+
pass
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'rake/clean'
2+
3+
CLEAN.include('*.bin')
4+
CLEAN.include('*/*.bin')
5+
CLEAN.include('*/*.txt')
6+
7+
task :default => 'seckey.bin' do
8+
cp 'seckey.bin', 'alice_sign'
9+
cp 'seckey.bin', 'bob_verify'
10+
end
11+
12+
file 'seckey.bin' do
13+
load 'generatekey.rb'
14+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
require 'openssl'
2+
3+
# load text to be signed
4+
plain = ARGF.read
5+
6+
# load SECRET key
7+
key = File.read("seckey.bin")
8+
9+
# sign
10+
# CAUTION: digester must be an instance of
11+
# ::OpenSSL::Digest::* not ::Digest::* even if
12+
# openssl is loaded.
13+
digester = OpenSSL::Digest::SHA1.new
14+
sig = OpenSSL::HMAC.digest(digester, key, plain)
15+
16+
File.open("plain.txt", "wb") do |file|
17+
file << plain
18+
end
19+
puts 'wrote text to plain.txt'
20+
21+
File.open("plain.sig.bin", "wb") do |file|
22+
file << sig
23+
end
24+
puts 'wrote sign to plain.sig.bin'

0 commit comments

Comments
 (0)