class OpenSSL::BN

[edit]

要約

OpenSSL内で利用される多倍長整数クラスです。

通常多倍長整数を利用するには Bignum を用いてください。

目次

特異メソッド
インスタンスメソッド

継承しているメソッド

Comparableから継承しているメソッド

特異メソッド

generate_prime(bits, safe=true, add=nil, rem=nil) -> OpenSSL::BN[permalink][rdoc][edit]

ランダム(疑似乱数的)な bits ビットの素数を返します。

暗号的に意味のある素数は十分大きくないといけないので、 bits が小さすぎる場合は期待する結果を返しません。

safe が真であれば、「安全な」素数((p-1)/2が素数である素数p)を返します。

add に整数を渡すと、 p % add == rem であるような素数pのみを返します。rem が nil の場合は rem=1と見なします。

[PARAM] bits:
生成するランダム素数のビット数
[PARAM] safe:
true で安全な素数のみを生成する
[PARAM] add:
生成する素数の剰余の条件
[PARAM] rem:
生成する素数の剰余の条件
[EXCEPTION] OpenSSL::BNError:
素数の生成に失敗した場合に発生します
new(str, base=10) -> OpenSSL::BN[permalink][rdoc][edit]

文字列を多倍長整数オブジェクト(OpenSSL::BN)を生成します。

base によって変換の基数を決めることができます。 10, 16 が利用可能です。

baseに2を指定すると文字列を big-endian の符号無し整数のバイナリ列とみなして変換します。

また、base に 0 を指定すると、MPIのフォーマットから変換します。 (最初の4byteはbig-endianでデータ長を表わし、その後にそのデータ長のバイト列(big-endian)で数値を表す。最上位ビットが立っていると負数)。

例:

require 'openssl'

OpenSSL::BN.new("-241") # => -241
OpenSSL::BN.new("ff00",16) # => 65280
OpenSSL::BN.new("\x81",2) # => 129
OpenSSL::BN.new("\xff\x81",2) # => 65409
OpenSSL::BN.new("\x00\x00\x00\x02\x00\x81", 0) # => 129
OpenSSL::BN.new("\x00\x00\x00\x02\x80\x81", 0) # => -129
OpenSSL::BN.new(1209) # => 1209
[PARAM] str:
整数を表す文字列
[PARAM] base:
文字列から整数に変換するときの基数
[EXCEPTION] OpenSSL::BNError:
変換に失敗した場合に発生します
new(bn) -> OpenSSL::BN[permalink][rdoc][edit]

OpenSSL::BN を複製して返します。

[PARAM] bn:
複製する OpenSSL::BN オブジェクト
new(integer) -> OpenSSL::BN[permalink][rdoc][edit]

整数オブジェクト(Integer)から多倍長整数オブジェクト (OpenSSL::BN)を生成します。

[PARAM] integer:
整数オブジェクト
pseudo_rand(bits, fill=0, odd=false) -> OpenSSL::BN[permalink][rdoc][edit]

乱数を生成し、返します。

乱数系列に暗号論的な強さはないため、暗号関連でない場合や、強さが必要でない場合に用いることができます。鍵生成のような場合には使えません。

bits ビットの長さの正の整数を生成します。

fill が -1 なら、生成させる数の最上位ビットが 0である場合を許容します。fill が 0 なら、生成させる数の最上位ビットは1にセットされます、つまり必ず bits ビットの整数となります。 fill が1の場合は、上位2ビットが1にセットされます。

odd が真なら、生成される整数は奇数のみとなります。

[PARAM] bits:
発生させる数のビット数
[PARAM] fill:
上位ビットの性質を決める整数
[PARAM] odd:
真なら発生させる数は奇数のみとなる
[EXCEPTION] OpenSSL::BNError:
乱数の生成に失敗した場合に発生します

[SEE_ALSO] OpenSSL::BN.rand, OpenSSL::BN.pseudo_rand_range

pseudo_rand_range(range) -> OpenSSL::BN[permalink][rdoc][edit]

乱数を 0 から range-1 までの間で生成し、返します。

乱数系列に暗号論的な強さはありません。

[PARAM] range:
生成する乱数の範囲
[EXCEPTION] OpenSSL::BNError:
乱数の生成に失敗した場合に発生します

[SEE_ALSO] OpenSSL::BN.pseudo_rand, OpenSSL::BN.rand_range

rand(bits, fill=0, odd=false) -> OpenSSL::BN[permalink][rdoc][edit]

暗号論的に強い疑似乱数を生成し、返します。

bits ビットの長さの正の整数を生成します。

fill が -1 なら、生成させる数の最上位ビットが 0である場合を許容します。fill が 0 なら、生成させる数の最上位ビットは1にセットされます、つまり必ず bits ビットの整数となります。 fill が1の場合は、上位2ビットが1にセットされます。

odd が真なら、生成される整数は奇数のみとなります。

[PARAM] bits:
発生させる数のビット数
[PARAM] fill:
上位ビットの性質を決める整数
[PARAM] odd:
真なら発生させる数は奇数のみとなる
[EXCEPTION] OpenSSL::BNError:
乱数の生成に失敗した場合に発生します

[SEE_ALSO] OpenSSL::BN.pseudo_rand, OpenSSL::BN.rand_range

rand_range(range) -> OpenSSL::BN[permalink][rdoc][edit]

暗号論的に強い疑似乱数を 0 から range-1 までの間で生成し、返します。

[PARAM] range:
生成する乱数の範囲
[EXCEPTION] OpenSSL::BNError:
乱数の生成に失敗した場合に発生します

[SEE_ALSO] OpenSSL::BN.rand, OpenSSL::BN.pseudo_rand_range

インスタンスメソッド

self % other -> OpenSSL::BN[permalink][rdoc][edit]

自身を other で割り算した余りを返します。

[PARAM] other:
除数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self * other -> OpenSSL::BN[permalink][rdoc][edit]

自身と other の積を返します。

[PARAM] other:
かける数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self ** other -> OpenSSL::BN[permalink][rdoc][edit]

自身の other 乗を返します。

[PARAM] other:
指数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self + other -> OpenSSL::BN[permalink][rdoc][edit]

自身と other の和を返します。

[PARAM] other:
足す整数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self - other -> OpenSSL::BN[permalink][rdoc][edit]

自身から other を引いた値を返します。

[PARAM] other:
引く整数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self / other -> [OpenSSL::BN, OpenSSL::BN][permalink][rdoc][edit]

自身を other で割った商と余りを配列で返します。

[PARAM] other:
除数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self << other -> OpenSSL::BN[permalink][rdoc][edit]

自身を other ビット左シフトした値を返します。

[PARAM] other:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
self <=> other -> -1 | 0 | 1[permalink][rdoc][edit]
cmp(other) -> -1 | 0 | 1

自身と other を比較し、自身が小さいときには -1、等しいときには 0、大きいときには 1 を返します。


require 'openssl'

OpenSSL::BN.new(5) <=> 5  # =>  0

OpenSSL::BN.new(5) <=> OpenSSL::BN.new(9)  # => -1
OpenSSL::BN.new(5) <=> OpenSSL::BN.new(5)  # =>  0
OpenSSL::BN.new(5) <=> OpenSSL::BN.new(-5)  # =>  1
[PARAM] other:
比較する整数
[EXCEPTION] TypeError:
比較できないときに発生します。

[SEE_ALSO] OpenSSL::BN#ucmp

self == other -> bool[permalink][rdoc][edit]
self === other -> bool
eql?(other) -> bool

自身と other が等しい場合に真を返します。

[PARAM] other:
比較する数
self >> other -> OpenSSL::BN[permalink][rdoc][edit]

自身を other ビット右シフトした値を返します。

[PARAM] other:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
bit_set?(n) -> bool[permalink][rdoc][edit]

自身の n ビット目が立っているなら真を返します。

例:

require 'openssl'

OpenSSL::BN.new("129").bit_set?(0) # => true
OpenSSL::BN.new("129").bit_set?(1) # => false
[PARAM] n:
調べるビットの位置
clear_bit!(n) -> self[permalink][rdoc][edit]

自身の n ビット目を0にします。

例:

require 'openssl'

a = OpenSSL::BN.new("129")
a.clear_bit!(0)
a # => 128
[PARAM] n:
0にするビットの位置
[EXCEPTION] OpenSSL::BNError:
計算時エラー
coerce(other) -> Array[permalink][rdoc][edit]

自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。

基本的に other が整数のときに、自身を Integer のオブジェクトに変換して [other, 変換後オブジェクト] にして返します。それ以外の場合は例外 TypeError を発生させます。

[PARAM] other:
変換の基準となるオブジェクト
[EXCEPTION] TypeError:
変換に失敗した場合に発生します
copy(other) -> self[permalink][rdoc][edit]

other の内容を自身にコピーします。

[PARAM] other:
コピーする OpenSSL::BN のオブジェクト
[EXCEPTION] OpenSSL::BNError:
コピーに失敗
gcd(other) -> OpenSSL::BN[permalink][rdoc][edit]

GCD(最大公約数)を返します。

[PARAM] other:
自身との GCD を計算する数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
lshift!(n) -> self[permalink][rdoc][edit]

自身を n ビット左シフトします。

[PARAM] n:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mask_bits!(n) -> self[permalink][rdoc][edit]

自身を下位 n ビットでマスクします。

n が自身のビット数より大きい場合は例外 OpenSSL::BNError が発生します。

[PARAM] n:
マスクするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_add(other, m) -> OpenSSL::BN[permalink][rdoc][edit]

(self + other) % m を返します。

例:

require 'openssl'

OpenSSL::BN.new("7").mod_add(OpenSSL::BN.new("3"), OpenSSL::BN.new("6")) # => 4
[PARAM] other:
和を取る数
[PARAM] m:
剰余を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_exp(other, m) -> OpenSSL::BN[permalink][rdoc][edit]

(self ** other) % m を返します。

例:

require 'openssl'

OpenSSL::BN.new("7").mod_exp(OpenSSL::BN.new("3"), OpenSSL::BN.new("6")) # => 1
[PARAM] other:
指数
[PARAM] m:
剰余を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_inverse(m) -> OpenSSL::BN[permalink][rdoc][edit]

自身の mod m における逆元を返します。

(self * r) % m == 1 となる r を返します。存在しない場合は例外 OpenSSL::BNError が発生します。

[PARAM] m:
mod を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_mul(other, m) -> OpenSSL::BN[permalink][rdoc][edit]

(self * other) % m を返します。

例:

require 'openssl'

OpenSSL::BN.new("7").mod_mul(OpenSSL::BN.new("3"), OpenSSL::BN.new("6")) # => 3
[PARAM] other:
積を取る数
[PARAM] m:
剰余を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_sqr(m) -> OpenSSL::BN[permalink][rdoc][edit]

(self ** 2) % m を返します。

[PARAM] m:
mod を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
mod_sub(other, m) -> OpenSSL::BN[permalink][rdoc][edit]

(self - other) % m を返します。

例:

require 'openssl'

OpenSSL::BN.new("27").mod_sub(OpenSSL::BN.new("3"), OpenSSL::BN.new("5")) # => 4
[PARAM] other:
引く数
[PARAM] m:
剰余を取る数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
num_bits -> Integer[permalink][rdoc][edit]

自身を表現するのに使っているビット数を返します。

符号は無視されます。

例:

require 'openssl'

OpenSSL::BN.new("127").num_bits # => 7
OpenSSL::BN.new("-127").num_bits # => 7
OpenSSL::BN.new("128").num_bits # => 8
num_bytes -> Integer[permalink][rdoc][edit]

自身を表現するのに使っているバイト数を返します。

odd? -> bool[permalink][rdoc][edit]

自身が奇数である場合に真を返します。

one? -> bool[permalink][rdoc][edit]

自身が1である場合に真を返します。

prime? -> bool[permalink][rdoc][edit]
prime?(checks) -> bool

自身が素数であるなら真を返します。

Miller-Rabin 法により確率的に判定します。 checkで指定した回数だけ繰り返します。引数を省略した場合は OpenSSL が適切な回数を判断します。

[PARAM] check:
Miller-Robin 法の繰り返しの回数
[EXCEPTION] OpenSSL::BNError:
判定時にエラーが発生

[SEE_ALSO] OpenSSL::BN#prime_fasttest?

prime_fasttest?(checks=nil, vtrivdiv=true) -> bool[permalink][rdoc][edit]

自身が素数であるなら真を返します。

vtrivdiv が真である場合には、 Miller-Rabin 法での判定の前に小さな素数で割ることで素数か否かを調べます。自身が小さな素数である場合にはこの手順により素数ではないと誤った返り値を返します。

Miller-Rabin 法により確率的に判定します。 checksで指定した回数だけ繰り返します。 checksがnilである場合は OpenSSL が適切な回数を判断します。

例:

require 'openssl'

# 181 は 「小さな素数」である
OpenSSL::BN.new("181").prime_fasttest?(nil, true) # => false
OpenSSL::BN.new("181").prime_fasttest?(nil, false) # => true
[PARAM] checks:
Miller-Robin法の繰り返しの回数
[PARAM] vtrivdiv:
真なら小さな素数で割ることでの素数判定を試みます
[EXCEPTION] OpenSSL::BNError:
判定時にエラーが発生

[SEE_ALSO] OpenSSL::BN#prime?

rshift!(n) -> self[permalink][rdoc][edit]

自身を n ビット右シフトします。

[PARAM] n:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー
set_bit!(n) -> self[permalink][rdoc][edit]

自身の n ビット目を1にします。

例:

require 'openssl'

a = OpenSSL::BN.new("128")
a.set_bit!(0)
a # => 129
[PARAM] n:
1にするビットの位置
[EXCEPTION] OpenSSL::BNError:
計算時エラー
sqr -> OpenSSL::BN[permalink][rdoc][edit]

自身の2乗を計算します。

[EXCEPTION] OpenSSL::BNError:
計算時エラー
to_bn -> self[permalink][rdoc][edit]

自分自身を返します。

to_i -> Integer[permalink][rdoc][edit]
to_int -> Integer

自身を Integer のインスタンスに変換します。

[EXCEPTION] OpenSSL::BNError:
変換に失敗した場合に発生します
to_s(base=10) -> String[permalink][rdoc][edit]

自身を表す文字列を返します。

base で基数を指定します。10,16を指定できます。 2を指定すると自身の絶対値を big-endian の符号無し整数のバイナリ列に変換します。 0を指定した場合には MPI 形式の文字列(バイト列)に変換します。

[PARAM] base:
文字列変換の基数
[EXCEPTION] OpenSSL::BNError:
変換に失敗した場合に発生します

[SEE_ALSO] OpenSSL::BN.new

ucmp(other) -> -1 | 0 | 1[permalink][rdoc][edit]

自身と other の絶対値を比較し、自身の絶対値が小さいときには -1、等しいときには 0、 大きいときには 1 を返します。


require 'openssl'

OpenSSL::BN.new(-5).ucmp(5)  # =>  0

OpenSSL::BN.new(5).ucmp(OpenSSL::BN.new(-9))  # => -1
OpenSSL::BN.new(-5).ucmp(OpenSSL::BN.new(5))  # =>  0
OpenSSL::BN.new(-5).ucmp(OpenSSL::BN.new(2))  # =>  1
[PARAM] other:
比較する整数
[EXCEPTION] TypeError:
比較できないときに発生します。

[SEE_ALSO] OpenSSL::BN#cmp

zero? -> bool[permalink][rdoc][edit]

自身が0である場合に真を返します。