Ruby 2.2.0 リファレンスマニュアル > ライブラリ一覧 > opensslライブラリ > OpenSSL::BNクラス

class OpenSSL::BN

クラスの継承リスト: OpenSSL::BN < Comparable < Object < Kernel < BasicObject

要約

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

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

目次

特異メソッド
generate_prime new pseudo_rand pseudo_rand_range rand rand_range
インスタンスメソッド
% * ** + - / << <=> cmp == === eql? >> bit_set? clear_bit! coerce copy gcd lshift! mask_bits! mod_add mod_exp mod_inverse mod_mul mod_sqr mod_sub num_bits num_bytes odd? one? prime? prime_fasttest? rshift! set_bit! sqr to_bn to_i to_int to_s ucmp zero?

特異メソッド

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

ランダム(疑似乱数的)な 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]

文字列を多倍長整数オブジェクト(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]

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

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

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

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

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

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

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]

乱数を 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]

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

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]

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

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

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

インスタンスメソッド

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

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

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

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

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

自身の other 乗を返します。

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

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

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

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

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

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

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

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

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

自身と other を比較し、otherのほうが小さければ-1、 大きければ+1、等しければ 0 を返します。

[PARAM] other:
比較する数
self == other -> bool[permalink][rdoc]
self === other -> bool
eql?(other) -> bool

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

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

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

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

自身の 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]

自身の 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]

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

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

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

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

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

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

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

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

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

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

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

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

(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]

(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]

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

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

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

(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]

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

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

(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]

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

符号は無視されます。

例:

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]

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

odd? -> bool[permalink][rdoc]

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

one? -> bool[permalink][rdoc]

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

prime? -> bool[permalink][rdoc]
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]

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

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]

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

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

自身の 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]

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

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

自分自身を返します。

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

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

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

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

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]

自身と other の絶対値を比較し、other の絶対値のほうが 自身の絶対値より小さければ-1、 大きければ+1、2つの絶対値が等しければ 0 を返します。

[PARAM] other:
比較する数
zero? -> bool[permalink][rdoc]

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