class OpenSSL::BN

[edit]

要約

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

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

目次

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

継承しているメソッド

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, 2, 0 を指定できます。

10  引数の文字列を 10進数とみなして、変換します。
16  引数の文字列を 16進数とみなして、変換します。
 2  引数の文字列を big-endian の符号無し整数のバイナリ列とみなして、変換します。
 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:
変換に失敗した場合に発生します

反対に、OpenSSL::BN クラスのオブジェクトを文字列にするには、 OpenSSL::BN#to_s を用います。

[SEE_ALSO] OpenSSL::BN#to_s

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:
整数オブジェクト

[SEE_ALSO] Integer#to_bn

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:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_mul

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

自身の other 乗を返します。

[PARAM] other:
指数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_exp

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

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

[PARAM] other:
足す整数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_add

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

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

[PARAM] other:
引く整数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_sub

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

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

[PARAM] other:
除数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_inverse

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

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


bn = 1.to_bn
pp bn << 1    # => #<OpenSSL::BN 2>
pp bn         # => #<OpenSSL::BN 1>
[PARAM] other:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#lshift!

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 が等しい場合に true を返します。

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

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


require 'openssl'

bn = 2.to_bn
bn >> 1    # => #<OpenSSL::BN 1>
bn         # => #<OpenSSL::BN 2>
[PARAM] other:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#rshift!

bit_set?(n) -> bool[permalink][rdoc][edit]

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


require 'openssl'

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

[SEE_ALSO] OpenSSL::set_bit!

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:
計算時エラー

[SEE_ALSO] OpenSSL::set_bit!

coerce(other) -> Array[permalink][rdoc][edit]

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

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


require 'openssl'
p 1.to_bn.coerce(2)  # => [2, 1]
[PARAM] other:
変換の基準となるオブジェクト
[EXCEPTION] TypeError:
変換に失敗した場合に発生します

coerce メソッドの詳細な説明は、Numeric#coerce にあります。

[SEE_ALSO] Numeric#coerce

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 ビット左シフトします。 OpenSSL::BN#<<と異なり、破壊的メソッドです。


require 'openssl'

bn = 1.to_bn
bn.lshift!(2)   # => #<OpenSSL::BN 4>
bn              # => #<OpenSSL::BN 4>
[PARAM] n:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#<<

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

自身を下位 n ビットでマスクし、破壊的に変更します。

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


require 'openssl'

bn = 0b1111_1111.to_bn

bn.mask_bits!(8)
p "%b" % bn      # => "11111111"

bn.mask_bits!(3)
p "%b" % bn      # =>     "111"
[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 が発生します。


require 'openssl'

p 3.to_bn.mod_inverse(5) # => 2
p (3 * 2) % 5            # => 1
[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:
計算時エラー

[SEE_ALSO] OpenSSL::BN#sqr

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:
計算時エラー
negative? -> bool[permalink][rdoc][edit]

自身が負である場合に true を返します。Ruby 2.5, OpenSSL 2.1.0 から利用できます。


require 'openssl'
p 15.to_bn.negative?    # => false
p  0.to_bn.negative?    # => false
p (-5).to_bn.negative?  # => true
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]

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


require 'openssl'

p 0.to_bn.num_bytes   # => 0
p 255.to_bn.num_bytes # => 1
p 256.to_bn.num_bytes # => 2

p  0b111_11111.to_bn.num_bytes # => 1
p 0b1000_00000.to_bn.num_bytes # => 2
odd? -> bool[permalink][rdoc][edit]

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

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

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

pretty_print(pp)[permalink][rdoc][edit]

Kernel.#pp でオブジェクトの内容を出力するときに、内部で呼ばれるメソッドです。


require 'openssl'

pp 5.to_bn     #=> #<OpenSSL::BN 5>
pp (-5).to_bn  #=> #<OpenSSL::BN -5>
[PARAM] pp:
PP クラスのインスタンスオブジェクト
prime? -> bool[permalink][rdoc][edit]
prime?(checks) -> bool

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

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]

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

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 ビット右シフトします。 [[m:OpenSSL::BN#>>]と異なり、破壊的メソッドです。


require 'openssl'

bn = 8.to_bn
bn.rshift!(1)    # => #<OpenSSL::BN 4>
bn               # => #<OpenSSL::BN 4>
[PARAM] n:
シフトするビット数
[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#>>

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:
計算時エラー

[SEE_ALSO] OpenSSL::clear_bit!, OpenSSL::bit_set?

sqr -> OpenSSL::BN[permalink][rdoc][edit]

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

[EXCEPTION] OpenSSL::BNError:
計算時エラー

[SEE_ALSO] OpenSSL::BN#mod_sqr

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, 0 を指定できます。

10  10進数の表記
16  16進数の表記
 2  big-endianの符号無し整数のバイナリ列
 0  MPI形式の文字列(バイト列)
[PARAM] base:
文字列への変換方法(基数)
[EXCEPTION] OpenSSL::BNError:
変換に失敗した場合に発生します

require 'openssl'

p 10.to_bn.to_s   # =>  "10"
p (-5).to_bn.to_s # =>  "-5"

p 0.to_bn.to_s(16)  # =>   "0"
p 9.to_bn.to_s(16)  # =>  "09"
p 10.to_bn.to_s(16) # =>  "0A"
p 16.to_bn.to_s(16) # =>  "10"
p 26.to_bn.to_s(16) # =>  "1A"
p 256.to_bn.to_s(16) # => "0100"

p 0.to_bn.to_s(2) # => ""
p 6.to_bn.to_s(2) # => "\x06"
p 7.to_bn.to_s(2) # => "\a"

p 0.to_bn.to_s(0) # => "\x00\x00\x00\x00"
p 6.to_bn.to_s(0) # => "\x00\x00\x00\x01\x06"
p 7.to_bn.to_s(0) # => "\x00\x00\x00\x01\a"

反対に、文字列から OpenSSL::BN クラスのインスタンスを作るには OpenSSL::BN.new を用います。

[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 である場合に true を返します。