OpenSSL内で利用される多倍長整数クラスです。
通常多倍長整数を利用するには Bignum を用いてください。
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と見なします。
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
new(bn) -> OpenSSL::BN
[permalink][rdoc]OpenSSL::BN を複製して返します。
new(integer) -> OpenSSL::BN
[permalink][rdoc]整数オブジェクト(Integer)から多倍長整数オブジェクト (OpenSSL::BN)を生成します。
pseudo_rand(bits, fill=0, odd=false) -> OpenSSL::BN
[permalink][rdoc]乱数を生成し、返します。
乱数系列に暗号論的な強さはないため、暗号関連でない場合や、強さが必要でない場合に用いることができます。鍵生成のような場合には使えません。
bits ビットの長さの正の整数を生成します。
fill が -1 なら、生成させる数の最上位ビットが 0である場合を許容します。fill が 0 なら、生成させる数の最上位ビットは1にセットされます、つまり必ず bits ビットの整数となります。 fill が1の場合は、上位2ビットが1にセットされます。
odd が真なら、生成される整数は奇数のみとなります。
[SEE_ALSO] OpenSSL::BN.rand, OpenSSL::BN.pseudo_rand_range
pseudo_rand_range(range) -> OpenSSL::BN
[permalink][rdoc]乱数を 0 から range-1 までの間で生成し、返します。
乱数系列に暗号論的な強さはありません。
[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 が真なら、生成される整数は奇数のみとなります。
[SEE_ALSO] OpenSSL::BN.pseudo_rand, OpenSSL::BN.rand_range
rand_range(range) -> OpenSSL::BN
[permalink][rdoc]暗号論的に強い疑似乱数を 0 から range-1 までの間で生成し、返します。
[SEE_ALSO] OpenSSL::BN.rand, OpenSSL::BN.pseudo_rand_range
self % other -> OpenSSL::BN
[permalink][rdoc]自身を other で割り算した余りを返します。
self * other -> OpenSSL::BN
[permalink][rdoc]自身と other の積を返します。
self ** other -> OpenSSL::BN
[permalink][rdoc]自身の other 乗を返します。
self + other -> OpenSSL::BN
[permalink][rdoc]自身と other の和を返します。
self - other -> OpenSSL::BN
[permalink][rdoc]自身から other を引いた値を返します。
self / other -> [OpenSSL::BN, OpenSSL::BN]
[permalink][rdoc]自身を other で割った商と余りを配列で返します。
self << other -> OpenSSL::BN
[permalink][rdoc]自身を other ビット左シフトした値を返します。
self <=> other -> -1 | 0 | 1
[permalink][rdoc]cmp(other) -> -1 | 0 | 1
自身と other を比較し、otherのほうが小さければ-1、大きければ+1、等しければ 0 を返します。
self == other -> bool
[permalink][rdoc]self === other -> bool
eql?(other) -> bool
自身と other が等しい場合に真を返します。
self >> other -> OpenSSL::BN
[permalink][rdoc]自身を other ビット右シフトした値を返します。
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
clear_bit!(n) -> self
[permalink][rdoc]自身の n ビット目を0にします。
例:
require 'openssl' a = OpenSSL::BN.new("129") a.clear_bit!(0) a # => 128
coerce(other) -> Array
[permalink][rdoc]自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。
基本的に other が整数のときに、自身を Integer のオブジェクトに変換して [other, 変換後オブジェクト] にして返します。それ以外の場合は例外 TypeError を発生させます。
copy(other) -> self
[permalink][rdoc]other の内容を自身にコピーします。
gcd(other) -> OpenSSL::BN
[permalink][rdoc]GCD(最大公約数)を返します。
lshift!(n) -> self
[permalink][rdoc]自身を n ビット左シフトします。
mask_bits!(n) -> self
[permalink][rdoc]自身を下位 n ビットでマスクします。
n が自身のビット数より大きい場合は例外 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
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
mod_inverse(m) -> OpenSSL::BN
[permalink][rdoc]自身の mod m における逆元を返します。
(self * r) % m == 1 となる r を返します。存在しない場合は例外 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
mod_sqr(m) -> OpenSSL::BN
[permalink][rdoc](self ** 2) % m を返します。
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
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 が適切な回数を判断します。
[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
[SEE_ALSO] OpenSSL::BN#prime?
rshift!(n) -> self
[permalink][rdoc]自身を n ビット右シフトします。
set_bit!(n) -> self
[permalink][rdoc]自身の n ビット目を1にします。
例:
require 'openssl' a = OpenSSL::BN.new("128") a.set_bit!(0) a # => 129
sqr -> OpenSSL::BN
[permalink][rdoc]自身の2乗を計算します。
to_bn -> self
[permalink][rdoc]自分自身を返します。
to_i -> Integer
[permalink][rdoc]to_int -> Integer
自身を Integer のインスタンスに変換します。
to_s(base=10) -> String
[permalink][rdoc]自身を表す文字列を返します。
base で基数を指定します。10,16を指定できます。 2を指定すると自身の絶対値を big-endian の符号無し整数のバイナリ列に変換します。 0を指定した場合には MPI 形式の文字列(バイト列)に変換します。
[SEE_ALSO] OpenSSL::BN.new
ucmp(other) -> -1 | 0 | 1
[permalink][rdoc]自身と other の絶対値を比較し、other の絶対値のほうが自身の絶対値より小さければ-1、大きければ+1、2つの絶対値が等しければ 0 を返します。
zero? -> bool
[permalink][rdoc]自身が0である場合に真を返します。