이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

F.25. pg범퍼카 토토o

pg범퍼카 토토o모듈은 범퍼카 토토 함수를 제공합니다PostgreSQL.

F.25.1. 일반 해싱 기능

F.25.1.1. digest ()

다이제스트 (데이터 텍스트, 텍스트 유형)는 bytea를 반환합니다

주어진 바이너리 해시를 계산합니다data. 타입사용할 알고리즘입니다. 표준 알고리즘은MD5, SHA1, SHA224, SHA256, SHA384SHA512. 만약에pg범퍼카 토토oOpenSSL로 제작되었으며 자세히 설명 된대로 더 많은 알고리즘을 사용할 수 있습니다.테이블 F.19.

다각형 문자열로 다이제스트를 원한다면encode ()결과. 예를 들어:

함수 생성 또는 교체 SHA1 (BYTEA) 텍스트를 $$로 반환합니다

F.25.1.2. hmac ()

HMAC (데이터 텍스트, 키 텍스트, 유형 텍스트)는 bytea를 반환합니다

해시 Mac을 계산합니다datawith key. 타입digest ().

이것은와 유사합니다digest ()그러나 해시는 키를 아는 것만 다시 계산할 수 있습니다. 이것은 데이터를 변경하고 해시를 일치하도록 변경하는 사람의 시나리오를 방지합니다.

키가 해시 블록 크기보다 큰 경우 먼저 해시되고 결과가 키로 사용됩니다.

F.25.2. 암호 해싱 함수

함수범퍼카 토토 ()gen_salt ()비밀번호 해싱 용으로 특별히 설계되었습니다.범퍼카 토토 ()해싱 및gen_salt ()알고리즘 매개 변수 준비.

알고리즘범퍼카 토토 ()다음 측면에서 일반적인 MD5 또는 SHA1 해싱 알고리즘과 다릅니다 :

  1. 느린다. 데이터의 양이 너무 작기 때문에 이것은 무차별 대결 암호를 어렵게 만드는 유일한 방법입니다.

  2. 그들은 random 값을 사용합니다.SALT, 동일한 암호를 가진 사용자가 범퍼카 토토 된 암호가 다릅니다. 이것은 또한 알고리즘을 뒤집는 것에 대한 추가 방어입니다.

  3. 결과에 알고리즘 유형이 포함되어 있으므로 다른 알고리즘으로 해시 된 암호는 공존 할 수 있습니다.

  4. 그중 일부는 적응력이 있습니다. 즉, 컴퓨터가 더 빨라질 때 기존 암호와 비 호환성을 도입하지 않고도 알고리즘을 느리게 조정할 수 있습니다..

테이블 F.16범퍼카 토토 ()기능.

표 F.16. 지원되는 알고리즘범퍼카 토토 ()

알고리즘 최대 비밀번호 길이 적응 형? 소금 비트 출력 길이 설명
BF 72 128 60 Blowfish-Based, Variant 2A
MD5 무제한 아니오 48 34 MD5 기반 Crypt
XDES 8 24 20 확장 DES
des 8 아니오 12 13 원래 Unix 범퍼카 토토

F.25.2.1. 범퍼카 토토 ()

범퍼카 토토 (비밀번호 텍스트, 소금 텍스트) 텍스트를 반환

암호 계산 (3)-스타일 해시비밀번호. 새 비밀번호를 저장할 때 사용해야합니다.gen_salt ()새로운 생성SALT값. 비밀번호를 확인하려면 저장된 해시 값을 전달합니다.SALT, 결과가 저장된 값과 일치하는지 여부를 테스트합니다.

새 비밀번호 설정의 예 :

업데이트 ... set pswhash = 범퍼카 토토 ( 'new password', gen_salt ( 'md5'));

인증의 예 :

PSWMATCH에서 ...;로 선택한 (pswhash = 범퍼카 토토 ( 'Enthed Password', PSWHASH))를 선택하십시오.

이것은 반환True입력 된 암호가 올바른 경우.

F.25.2.2. gen_salt ()

gen_salt (텍스트 유형 [, iter_count integer]) 텍스트를 반환

범퍼카 토토 (). 소금 끈도 말해범퍼카 토토 ()사용할 알고리즘.

타입매개 변수 해싱 알고리즘을 지정합니다. 허용 된 유형은 다음과 같습니다.des, XDES, MD5BF.

iter_count매개 변수를 사용하면 사용자가 반복 카운트를 지정할 수 있습니다. 카운트가 높을수록 비밀번호를 해시하는 데 더 많은 시간이 걸리므로 더 많은 시간이 걸립니다.iter_count매개 변수가 생략되고 기본 반복 카운트가 사용됩니다. 허용 값iter_count알고리즘에 의존하고테이블 F.17.

표 F.17. 반복 카운트범퍼카 토토 ()

알고리즘 기본값 Min max
XDES 725 1 16777215
BF 6 4 31

forXDES반복 카운트가 홀수 숫자 여야한다는 추가 제한이 있습니다.

적절한 반복 카운트를 선택하려면 원래 DES 범퍼카 토토가 해당 하드웨어에서 초당 4 개의 해시 속도를 갖도록 설계되었음을 고려하십시오. 초당 4 해시보다 느리면 유용성이 약화 될 수 있습니다.

테이블 F.18다른 해싱 알고리즘의 상대 속도가 느려지는 개요를 제공합니다. 이 표는 암호에 소문자 또는 하급 문자 및 숫자 만 포함되어 있다고 가정 할 때 8 문자 암호로 문자의 모든 조합을 시도하는 데 얼마나 많은 시간이 걸리는지를 보여줍니다.범퍼카 토토-bf항목, 슬래시 후 숫자는입니다.iter_count매개 변수gen_salt.

테이블 F.18. 해시 알고리즘 속도

알고리즘 해시/초 for[A-Z] for[A-Za-Z0-9] 기간에 대한 기간MD5 HASH
범퍼카 토토-bf/8 1792 4 년 3927 년 100k
범퍼카 토토-bf/7 3648 2 년 1929 년 50k
범퍼카 토토-bf/6 7168 1 년 982 년 25K
범퍼카 토토-bf/5 13504 188 일 521 ​​년 12.5k
범퍼카 토토-md5 171584 15 일 41 년 1K
crypt-des 23221568 157.5 분 108 일 7
SHA1 37774272 90 분 68 일 4
MD5(해시) 150085504 22.5 분 17 일 1

참고 :

  • 사용되는 기계는 인텔 모바일 코어 i3입니다.

  • crypt-des범퍼카 토토-md5알고리즘 번호는 John The Ripper v1.6.38에서 가져 왔습니다.-test출력.

  • MD5 HASH숫자는 mdcrack에서 나온 것입니다.

  • SHA1숫자는 Lcrack-20031130-Beta에서 나온 것입니다.

  • 범퍼카 토토-bf숫자는 1000 개 이상의 8 자 암호를 반복하는 간단한 프로그램을 사용하여 사용됩니다. 그렇게하면 다른 수의 반복으로 속도를 보여줄 수 있습니다.John -test13506 루프/SEC for 표시범퍼카 토토-bf/5. (결과의 매우 작은 차이는 사실에 따른 것입니다.범퍼카 토토-bf구현pg범퍼카 토토oJohn the Ripper에서 사용 된 것과 동일합니다.)

참고모든 조합 시도는 현실적인 운동이 아닙니다. 일반적으로 비밀번호 균열은 사전과 다양한 돌연변이를 모두 포함하는 사전의 도움으로 수행됩니다.

F.25.3. PGP 범퍼카 토토 기능

여기에서 함수는 OpenPGP (RFC 4880) 표준의 범퍼카 토토 부분을 구현합니다. 지원되는 대칭 키 및 공개 키 범퍼카 토토입니다.

범퍼카 토토 된 PGP 메시지는 두 부분으로 구성됩니다.패킷:

  • 세션 키를 포함하는 패킷-대칭 키 또는 공개 키 범퍼카 토토.

  • 세션 키와 범퍼카 토토 된 데이터를 포함하는 패킷.

대칭 키를 범퍼카 토토 할 때 (즉, 암호) :

  1. 주어진 암호는 String2key (S2K) 알고리즘을 사용하여 해시됩니다. 이것은와 다소 비슷합니다.범퍼카 토토 ()알고리즘-의도적으로 느리고 임의의 소금으로-전장 바이너리 키를 생성합니다.

  2. 별도의 세션 키가 요청되면 새로운 랜덤 키가 생성됩니다. 그렇지 않으면 S2K 키는 세션 키로 직접 사용됩니다.

  3. S2K 키를 직접 사용하려면 S2K 설정 만 세션 키 패킷에 넣습니다. 그렇지 않으면 세션 키가 S2K 키로 범퍼카 토토되어 세션 키 패킷에 넣습니다.

공개 키로 범퍼카 토토 할 때 :

  1. 새로운 랜덤 세션 키가 생성됩니다.

  2. 공개 키를 사용하여 범퍼카 토토되어 세션 키 패킷에 넣습니다.

두 경우 모두 범퍼카 토토 할 데이터가 다음과 같이 처리됩니다.

  1. 선택적 데이터 조작 : 압축, UTF-8 로의 전환 및/또는 라인 목록의 변환.

  2. 데이터는 임의의 바이트 블록으로 접두사를 만듭니다. 이것은 임의의 IV를 사용하는 것과 같습니다.

  3. 랜덤 접두사 및 데이터의 SHA1 해시가 추가되었습니다.

  4. 이 모든 것은 세션 키로 범퍼카 토토되어 데이터 패킷에 배치됩니다.

F.25.3.1. pgp_sym_en범퍼카 토토 ()

PGP_SYM_EN범퍼카 토토 (데이터 텍스트, PSW 텍스트 [, 옵션 텍스트])는 BYTEA를 반환합니다.

범퍼카 토토data대칭 PGP 키와 함께PSW. 그만큼옵션매개 변수는 아래에 설명 된대로 옵션 설정을 포함 할 수 있습니다.

F.25.3.2. pgp_sym_de범퍼카 토토 ()

PGP_SYM_DECRYPT (MSG BYTEA, PSW 텍스트 [, 옵션 텍스트]) 텍스트를 반환합니다.

대칭 키 범퍼카 토토 된 PGP 메시지를 해독합니다.

해독BYTEAwithpgp_sym_de범퍼카 토토허용되지 않습니다. 이것은 잘못된 문자 데이터를 출력하지 않습니다.PGP_SYM_DECRYPT_BYTEA괜찮습니다.

옵션매개 변수는 아래에 설명 된대로 옵션 설정을 포함 할 수 있습니다.

F.25.3.3. pgp_pub_en범퍼카 토토 ()

PGP_PUB_ENCRYPT (데이터 텍스트, 키 바이트 [, 옵션 텍스트])는 BYTEA를 반환합니다.

범퍼카 토토data공개 PGP 키 포함. 이 기능을 비밀 키에게 제공하면 오류가 발생합니다.

옵션매개 변수는 아래에 설명 된대로 옵션 설정을 포함 할 수 있습니다.

F.25.3.4. pgp_pub_de범퍼카 토토 ()

pgp_pub_decrypt (msg bytea, key bytea [, psw text [, 옵션 텍스트]]) 텍스트를 반환합니다.

공개 키 범퍼카 토토 메시지를 해독합니다.범퍼카 토토에 사용 된 공개 키에 해당하는 비밀 키 여야합니다. 비밀 키가 암호로 보호 된 경우에서 암호를 제공해야합니다.PSW. 비밀번호가 없지만 옵션을 지정하려면 빈 비밀번호를 제공해야합니다.

해독BYTEAwithPGP_PUB_DE범퍼카 토토허용되지 않습니다. 이것은 잘못된 문자 데이터를 출력하지 않습니다.PGP_PUB_DE범퍼카 토토_BYTEA괜찮습니다.

옵션매개 변수는 아래에 설명 된대로 옵션 설정을 포함 할 수 있습니다.

F.25.3.5. pgp_key_id ()

pgp_key_id (bytea) 텍스트를 반환

pgp_key_idPGP 공개 또는 비밀 키의 키 ID를 추출합니다. 또는 범퍼카 토토 된 메시지가 주어지면 데이터를 범퍼카 토토하는 데 사용 된 키 ID를 제공합니다.

2 개의 특별 키 ID를 반환 할 수 있습니다 :

  • Symkey

    메시지는 대칭 키로 범퍼카 토토됩니다.

  • Anykey

    메시지는 공개 키 범퍼카 토토되었지만 키 ID가 제거되었습니다. 즉, 어떤 비밀 키를 해독하는지 확인하기 위해 모든 비밀 키를 시도해야합니다.pg범퍼카 토토o그 자체는 그러한 메시지를 생성하지 않습니다.

다른 키는 동일한 ID를 가질 수 있습니다. 이것은 드물지만 정상적인 사건입니다.Anykey.

F.25.3.6. Armor (), dearmor ()

Armor (Data Bytea [, Keys Text [], value text []]) 텍스트를 반환합니다.

이 함수는 PGP Ascii-Armor 형식으로 래프/랩핑 바이너리 데이터를 포장합니다. 기본적으로 CRC 및 추가 서식이 포함 된 Base64입니다.

배열이 지정되어 있습니다.갑옷 헤더각 키/값 쌍의 장갑 형식에 추가됩니다. 두 배열 모두 단일 차원이어야하며 길이가 같아야합니다.

F.25.3.7. pgp_armor_headers

PGP_ARMOR_HEADERS (데이터 텍스트, 키 아웃 텍스트, 값 텍스트 텍스트)를 반환

pgp_armor_headers ()갑옷 헤더 추출data. 리턴 값은 키와 값의 두 열이있는 행 세트입니다.

F.25.3.8. PGP 기능 옵션

옵션은 gnupg와 유사하게 지명되었습니다. 옵션의 값은 동일한 부호 후에 제공되어야합니다.

pgp_sym_encrypt (data, psw, 'compress-algo = 1, cipher-algo = aes256')

제외한 모든 옵션Convert-CRLF범퍼카 토토 함수에만 적용하십시오. 해독 함수는 PGP 데이터에서 매개 변수를 얻습니다.

가장 흥미로운 옵션은 아마도입니다.compress-algo유니 코드 모드. 나머지는 합리적인 불이행이 있어야합니다.

F.25.3.8.1. 암호-알 고

사용할 암호 알고리즘.


값 : BF, AES128, AES192, AES256 (OpenSSL- 전용 :3DES,Cast5)
기본값 : AES128
적용 : pgp_sym_en범퍼카 토토, pgp_pub_en범퍼카 토토

F.25.3.8.2. 압축 알 고

사용할 압축 알고리즘. 사용 가능PostgreSQLZlib와 함께 지어졌습니다.


값 :
  0- 압축 없음
  1- 지퍼 압축
  2-Zlib 압축 (= zip plus meta-data and block crcs)
기본값 : 0
적용 : pgp_sym_en범퍼카 토토, pgp_pub_en범퍼카 토토

F.25.3.8.3. 압축 수준

압축 할 금액. 더 높은 레벨은 더 작지만 느리게 압축됩니다.


값 : 0, 1-9
기본값 : 6
적용 : pgp_sym_en범퍼카 토토, pgp_pub_en범퍼카 토토

F.25.3.8.4. Convert-CRLF

변환 여부\ nin\ r \ n범퍼카 토토 할 때\ r \ nto\ n해독 할 때. RFC 4880은 텍스트 데이터를 사용하여 저장해야한다고 지정합니다.\ r \ n라인 피드. 이것을 사용하여 완전히 RFC 호환 동작을 얻으십시오.


값 : 0, 1
기본값 : 0
신청

F.25.3.8.5. 비활성화 MDC

SHA-1로 데이터를 보호하지 마십시오. 이 옵션을 사용하는 유일한 이유는 고대 PGP 제품과의 호환성을 달성하여 RFC 4880에 SHA-1 보호 패킷을 추가하는 것을 포기하는 것입니다. 최근 gnupg.org 및 pgp.com 소프트웨어가 잘 지원됩니다..


값 : 0, 1
기본값 : 0
적용 : pgp_sym_en범퍼카 토토, pgp_pub_en범퍼카 토토

F.25.3.8.6. Sess-Key

별도의 세션 키 사용. 공개 키 범퍼카 토토는 항상 별도의 세션 키를 사용합니다.


값 : 0, 1
기본값 : 0
적용 : pgp_sym_en범퍼카 토토

F.25.3.8.7. S2K 모드

사용할 S2K 알고리즘.


값 :
  0- 소금없이.  
  1- 소금이 있지만 고정 된 반복 카운트.
  3- 가변 반복 카운트.
기본값 : 3
적용 : pgp_sym_en범퍼카 토토

F.25.3.8.8. s2k-count

사용할 S2K 알고리즘의 반복 수. 1024와 65011712 사이의 값이어야합니다.


기본값 : 65536과 253952 사이의 임의 값
적용 : pgp_sym_en범퍼카 토토, s2k-mode = 3

F.25.3.8.9. S2K 자리-알 고

S2K 계산에 사용할 수있는 여러분 알고리즘.


값 : MD5, SHA1
기본값 : SHA1
적용 : pgp_sym_en범퍼카 토토

F.25.3.8.10. s2k-cipher-algo

별도의 세션 키를 범퍼카 토토하는 데 사용할 암호.


값 : BF, AES, AES128, AES192, AES256
기본값 : Cipher-Algo 사용
적용 : pgp_sym_en범퍼카 토토

F.25.3.8.11. 유니 코드 모드

텍스트 데이터를 데이터베이스 내부 인코딩에서 UTF-8 및 뒤로 변환할지 여부. 데이터베이스가 이미 UTF-8 인 경우 변환이 수행되지 않지만 메시지는 UTF-8으로 태그됩니다.


값 : 0, 1
기본값 : 0
적용 : pgp_sym_en범퍼카 토토, pgp_pub_en범퍼카 토토

F.25.3.9. GNUPG로 PGP 키 생성

새로운 키를 생성하려면 :

gpg-gen-key

선호하는 키 유형은입니다.DSA 및 ELGAMAL.

RSA 범퍼카 토토의 경우 DSA 또는 RSA 부호 전용 키를 마스터로 생성 한 다음 RSA 범퍼카 토토 서브 키를 추가해야합니다gpg -Edit-Key.

열쇠를 나열하려면 :

gpg-list-secret-keys

ascii-Armor 형식으로 공개 키를 내보내려면 :

gpg -a -export keyid> public.key

Ascii-Armor 형식으로 비밀 키를 내보내려면 :

gpg -a -export-secret-keys keyid> Secret.key

사용해야dearmor ()이 키에서 PGP 함수에 제공하기 전에. 또는 이진 데이터를 처리 할 수 ​​있으면 삭제할 수 있습니다-a명령에서.

자세한 내용은 참조Man GPG, GNU 개인 정보 핸드북및 기타 문서https://www.gnupg.org/.

F.25.3.10. PGP 코드 제한

  • 서명에 대한 지원이 없습니다. 그것은 또한 범퍼카 토토 서브 키가 마스터 키에 속하는지 여부를 확인하지 않음을 의미합니다.

  • 마스터 키로 범퍼카 토토 키를 지원하지 않습니다. 그러한 관행은 일반적으로 낙담하기 때문에 이것은 문제가되지 않아야합니다.

  • 여러 하위 키에 대한 지원이 없습니다. 이것은 일반적인 관행이기 때문에 이것은 문제처럼 보일 수 있습니다.pg범퍼카 토토o, 그러나 사용 시나리오가 다소 다르기 때문에 새로운 것을 만듭니다.

F.25.4. 원시 범퍼카 토토 기능

이 함수는 데이터보다 암호를 실행합니다. PGP 범퍼카 토토의 고급 기능이 없습니다.

  1. 사용자 키를 암호 키로 직접 사용합니다.

  2. 범퍼카 토토 된 데이터가 수정되었는지 확인하기 위해 무결성 검사를 제공하지 않습니다.

  3. 사용자는 모든 범퍼카 토토 매개 변수 자체를 관리 할 것으로 예상합니다. IV.

  4. 텍스트를 처리하지 않습니다.

따라서 PGP 범퍼카 토토의 도입으로 원시 범퍼카 토토 기능의 사용이 권장되지 않습니다.

Encrypt (Data Bytea, Key Bytea, type toint)는 Bytea를 반환합니다

|타입. 의 구문타입문자열은 :

알고리즘 [ - 모드 ] [ /pad : 패딩 ]

여기서알고리즘중 하나입니다.

  • BF- Blowfish

  • AES-AES (Rijndael -128, -192 또는 -256)

모드중 하나입니다.

  • CBC- 다음 블록은 이전 (기본값)에 따라 다릅니다.

  • ECB- 각 블록은 별도로 범퍼카 토토됩니다 (테스트 만 해당)

패딩중 하나입니다.

  • PKCS- 데이터는 길이 (기본값) 일 수 있습니다

  • 없음- 데이터는 암호 블록 크기의 배수 여야합니다

예를 들어, 이들은 다음과 같습니다.

범퍼카 토토 (데이터, 'fooz', 'bf')

inEn범퍼카 토토_ivde범퍼카 토토_iv,IV매개 변수는 CBC 모드의 초기 값입니다. ECB에 대해서는 무시됩니다.

F.25.5. 랜덤 데이터 기능

gen_random_bytes (count integer)를 반환합니다

반환count암호적으로 강한 무작위 바이트. 최대 1024 바이트는 한 번에 추출 될 수 있습니다.

gen_random_uuid () returns uuid

버전 4 (랜덤) UUID를 반환합니다.

F.25.6. 노트

F.25.6.1. 구성

pg범퍼카 토토o주요 PostgreSQL의 결과에 따라 자체적으로 구성구성스크립트. 영향을 미치는 옵션은입니다.-with-zlib-with-OpensSL.

Zlib로 컴파일 된 경우 PGP 범퍼카 토토 기능은 범퍼카 토토하기 전에 데이터를 압축 할 수 있습니다.

OpenSSL로 컴파일하면 더 많은 알고리즘이 있습니다. 또한 OpenSSL이 더 최적화 된 Bignum 함수를 가지고 있기 때문에 공개 키 범퍼카 토토 기능이 더 빠릅니다.

표 F.19. OpenSSL이 있거나없는 기능 요약

기능 내장 with OpenSSL
MD5
SHA1
SHA224/256/384/512
다른 다이제스트 알고리즘 아니오 예 (참고 1)
Blowfish
AES
des/3des/cast5 아니오
원시 범퍼카 토토
PGP 대칭 범퍼카 토토
PGP Public-Key 범퍼카 토토

OpenSSL3.0.0 이상 버전에서 레거시 제공 업체는에서 활성화되어야합니다.openssl.cnfdes 또는 blowfish와 같은 오래된 암호를 사용하기위한 구성 파일

참고 :

  1. 모든 다이제스트 알고리즘 OpenSSL 지원이 자동으로 선택됩니다. 이것은 암호로는 불가능하며 명시 적으로 지원되어야합니다.

F.25.6.2. 널 핸들링

SQL의 표준과 마찬가지로, 인수 중 어느 것이면 모든 기능은 NULL을 반환합니다. 이것은 부주의 한 사용에 대한 보안 위험을 초래할 수 있습니다.

F.25.6.3. 보안 제한

allpg범퍼카 토토o함수는 데이터베이스 서버 내부에서 실행됩니다. 즉, 모든 데이터와 암호가 사이에 이동한다는 것을 의미합니다.pg범퍼카 토토o및 클라이언트 응용 프로그램은 명확한 텍스트입니다. 따라서 당신은해야합니다 :

  1. 로컬로 연결하거나 SSL 연결을 사용하십시오.

  2. 시스템 및 데이터베이스 관리자를 모두 신뢰합니다.

할 수 없다면 클라이언트 애플리케이션 내부에서 범퍼카 토토하는 것이 좋습니다.

구현은 저항하지 않습니다사이드 채널 공격. 예를 들어, A에 필요한 시간pg범퍼카 토토o완료하는 암호 해독 함수는 주어진 크기의 암호 텍스트마다 다릅니다.

F.25.6.4. 유용한 독서

F.25.6.5. 기술 참조

F.25.7. 작가

Marko Kreen

pg범퍼카 토토o다음 소스에서 코드를 사용합니다.

알고리즘 저자 소스 원점
des crypt David Burren 및 기타 freebsd lib범퍼카 토토
md5 범퍼카 토토 Poul-Henning Kamp freebsd lib범퍼카 토토
Blowfish Crypt Solar Designer www.openwall.com
Blowfish Cipher Simon Tatham 퍼티
Rijndael Cipher Brian Gladman OpenBSD SYS/범퍼카 토토O
MD5 HASH 및 SHA1 넓은 프로젝트 Kame Kame/Sys/Crypto
SHA256/384/512 Aaron D. Gifford OpenBSD SYS/범퍼카 토토O
Bignum Math Michael J. Fromberger dartmouth.edu/~sting/sw/imath