2013������9·���4�����䏢����³«��돪����µ������������OpenID Tech Night Vol.10 ������»²²������·��������������¡�

���������­������\��\���\Ð\���\���������������RSA½��Ï��¾����������¾��⏢����·���¹½�����������Џ��������¹��¡� RSA������½��Ï��¾������������������������¾��⏢����������·��»»\³\¹\������̏��«���«����������������...

�����Ώ����ď����������������������ҏ��µ��������¡��ӏ����я����я���µ��؏�����������������������������¡�RSA½��Ï��¾����������¾��⏢����½��Ï��¾�����������������������������µ�����򏪩��쏢����·��»»\³\¹\�����������������������������¡�¡ߏ��������« »�ߏ����������������ď��������ޏ��������ӏ��̏��̏������������я�¡ߏ�������¡� ���ӏ�����������¡���������������������������������㏢���������Ώ����������㏢����¡�¡ߏ�����¼���»�������������\����¼\���PC����������������㏢���������Ώ��������·�����ď�¡�

������¾��⏩����������

�돪�²¼�������³�����������ҏ�����¾��⏢�·�����������Ώ����ď�����������»�ߏ��������������¹��¡�

  • ½��Ï��¾�������������������������¾��⏢�������������������������������̏���������������«��¡�RSA������ECC(ECDSA)�������������돫����������̏��������������«��¡�
  • ����ޏ����̏����㏢���¡돪�¹�������������㏢����RSA½��Ï��¾������ECDSA½��Ï��¾��������������������������������������������������㏢�¹���̏��������������«��¡�
  • RSA½��Ï��¾����������������돪�¹���̏����Џ����������������ď��������­��¡�������������������������������������㏢�¹���̏��������������«��¡�
  • ECDSA½��Ï��¾�������������������ޏ�΢���������Џ���������돪�¹���̏����Џ����������������ď��������­��¡�������������������������������������㏢�¹���̏��������������«��¡�
  • Ruby+OpenSSL������Java JCE��������������������������������������������������㏢�¹���̏��������������«��¡�
�����������я��«��¡񏪤����ޏ�Ώ���\���\���\»���¼��¡ߏ����Ώ����ď�������������ď�������������쏢�������������������¹���̏�¡� ���ӏ������ޏ�Ώ���������돪�¹���̏��»���������«��������µ�����򏪩��쏢���������������¡ߏ����Ώ����ď�����������»��ӏ����ҏ�����������½Ð���¹��ď�������������������� ����\���\���\������«���������������폢¡ߏ���������������㏢���������Ώ����ď��«�����������ď��������ޏ��������¹��¡� �������ޏ�Ώ���������������䏪���ԏ��¹�����������叢�������½�����я�����������������������������������������¹���������������� ���������·�����������㏢�������������¹��������������¡�

������¾��⏪���򏪳����Ï�����¾��⡭�����­

�������������������Ð���������̏�������������������������������������������������OpenSSL\��㏢�¼\¹��������������������Java JCE\��㏢�¼\¹������������������������������㏢�������¹��¡� ������������������������OpenSSL������C������½��Џ�������������������������������������������¡�Ruby������»������������������·�����ď�¡� ½���������»��С���ӏ�������̏����������򏪳���������������������������������¡�Ruby+OpenSSL��¡�Java JCE������¼����������������Ï���������Џ���������������̏��������·���������������������¹��¡�

���������
  • ����돢����¾��⏪����½��Џ�����\������¼\���������»��С���ӏ�����½���������»��С���ӏ������������������������������¡�
  • ����̏�����¾���·���������돫����������ď�����\���\���\·\���·��»»������»��С���ӏ�����½���������»��С���ӏ������������������������¡�
  • ����ޡ돫�������\���\·\��я���������̏��������¹��������¡�
  • ��돩������̏����Џ��·����������������ޡ돫���������돢����2000²��я�����½��Ï��¾�����������¡�½��Ï��¾������¾��⏢����»��С���ӏ�����·�ߏ���̏�¡�
  • ������³«�����돪�¹���������\���\���\��폢�¼\���\���\¹�����ҏ��������������ď��������������ޏ���������������½��Ï��¾���о�������"aaa"�������»������������»��⏪�я�¡�
  • SHA1withRSA���������·������������SHA1withECDSA������������³��я��¹��������¡�
Ruby+OpenSSL
  • Ruby������½���������'benchmark'\���\���\������¼\��������ҏ����Џ�������¡�\���\������¼\µ\���������¹��ԏ����Ï�¡�benchmark������real������»��С���ӏ����ҏ����Џ�������������¡�
Java JCE
  • \���\���\������¼\·\���\���\������¼\�ߏ�������돢����������������System.currentTimeMillis()�����������������¹������½���������»��С���ӏ��������¹��������¡�
��돪㏢�«������������¾��⡭�����­¾��Ï����я������돪�²¼�������������������������������������������¹��¡�
������¾��⡭�����­
\���\·\���Lenovo X201s
CPUIntel Core i7 L620 2.00GHz
\���\���\���8GB
OSMicrosoft Windows 7 Professional 32bit SP1
Java
\Ð���¼\���\���\���Oracle Java 1.7.0 build 1.7.0-b147
RSA½��Ï��¾JCE\��\���\Ð\���\���SunRsaSign 1.7 Provider
ECDSA½��Ï��¾JCE\��\���\Ð\���\���SunEC 1.7 Provider
Ruby (+ OpenSSL)
\Ð���¼\���\���\���cygwin C Ruby 1.9.3p194
OpenSSLOpenSSL 1.0.1c

Ruby + OpenSSL������½��Ï��¾

Ruby + OpenSSL������RSA������ECDSA½��Ï��¾���¹��������������������¡�OpenSSL\³\���\���\��������������������������� PKCS#5���������������폢��돢����������³«����돢����½�����������·���������³�����я���������������������½��Ï��¾�����������¡�½��Ï��¾������¾��⏢�¹���������Ð\���\���\·��¡�

# ECDSA������½��Ï��¾������������
prvKey = OpenSSL::PKey::EC.new(File.read(PKCS#5�����������폢���PEM))
hashed = OpenSSL::Digest::SHA1.digest(½��Ï��¾���о���\���\���\»���¼\���)
sigVal = prvKey.dsa_sign_asn1(hashed)

# ECDSA������½��Ï��¾������¾���
pubKey = OpenSSL::PKey::EC.new(File.read(PKCS#5������³«�����PEM))
hashed = OpenSSL::Digest::SHA1.digest(data)
isValid = pubKey.dsa_verify_asn1(hashed, sigVal)

# RSA������½��Ï��¾������������
prvKey = OpenSSL::PKey::RSA.new(File.read(PKCS#5�����������폢���PEM))
sigVal = prvKey.sign("sha1", data)   

# RSA������½��Ï��¾������¾���
pubKey = OpenSSL::PKey::RSA.new(File.read(PKCS#5������³«�����PEM))
isValid = pubKey.verify("sha1", sigVal, data)   
ECDSA������»��Џ�����\���\���\·\���������¼«����̏�����·��»»���¹������������������¡� ECDSA������½��Ï��¾������������ASN.1¹½���������������½���½���¹���������³������������µ��������ҏ��������ޏ��������Ð���������������������������«������»�ߏ��������������¹��¡�

Java JCE������½��Ï��¾

��돪��������¡�\­���¼\¹\���\��»���������������³��⏢�·�����������ď��������������������������������\���\���\���\��������ҏ����������Ώ����ď�����¾���¹�����������������¡� PKCS#8 DER���������������������������������������ޏ����������������я��������������������������«���µ���·�����������Ώ����������� ¼«����̏�����µ­»��� ����OpenSSL����������돪����������·�����ď����������폢��돢����Java������»��������Ï�¡����̏��«���������«������������½��؏��«���������������·�����ď�¡� �����������폢���\���\���\���\���������PKCS#8���������·��������������������¡񏢱���³«����돢����PKCS#8���������·�����������Ï��������·�����ď����� ���ӏ��������������������������������������쏢�쏢¡ߏ���돢����\���\���\������¼\��ď�����ď�ԏ�����(BigInteger)������»������������¹���������« ¾��⏪����½��Џ��������������������������������������ޏ��������������½�����Ï�������¡�»����������������������«���������µ����������������¼«������½��Ï��¾¾��⏪����½��Џ����ҏ�돫��������������·�����ď�¡�

ECDSA������½��Ï��¾������������������³�����я�����������������¡�

KeySpec keySpec = new PKCS8EncodedKeySpec(PKCS#8�����������폢���DER������\������¼\���byte�����只��);
KeyFactory kf = KeyFactory.getInstance("EC");
PrivateKey prvKey = kf.generatePrivate(keySpec);
Signature sig = Signature.getInstance("SHA1withECDSA");
sig.initSign(prvKey);
sig.update(½��Ï��¾���о���\������¼\���aaa);
sigVal = sig.sign();

RSA������½��Ï��¾������������������³�����я�����������������¡�

KeySpec keySpec = new PKCS8EncodedKeySpec(PKCS#8�����������폢���DER������\������¼\���byte�����只��);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey prvKey = kf.generatePrivate(keySpec);
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initSign(prvKey);
sig.update(½��Ï��¾���о���\������¼\���aaa);
sigVal = sig.sign();

RSA������ECDSA������½��Ï��¾������¾��⏢�������³�����я�����������������¡�

CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cer = (X509Certificate)cf.generateCertificate(new FileInputStream(������³«�����¾��⏪����½���));
pubKey = cer.getPublicKey();
Signature sig = Signature.getInstance("SHA1withECDSA"); // RSA������������SHA1withRSA
sig.initVerify(pubKey);
sig.update(½��Ï��¾���о���\������¼\���);
isValid = sig.verify(sigVal);

��돪�½�����¡�BouncyCastle»�����𡯏��Ð���������������«������������»�ߏ����������ď����я��������¹���̏�¡� Java SE 7���«�������������ޏ�Ώ����Џ�����\��\���\Ð\���\���SunEC���̏�����½��������Ѣ�����µ�����������������������Ï����������������������ď�����������¡� Java SE 7����������½���\Ð\���\���\������µ������������\��\���\Ð\���\���������»��������Ï��³���������������·���������·�����ď�¡� \µ\����¼\������·�������������������������ޏ�΢���������Џ����������������Ï��������������ޏ�����»�ߏ����������ď����� ����돢����¼«����̏���������������㏢�����������������ď������������½������������»²¹������������·���������·�����ď�¡� ( ½��� Java SE 7 \���\������¼\¹µ­����돢��JCE�����������������Ï����������������������я������폢¡�)

RSA������ECC�����¡돪�¹�������������㏪�Ð�ޏ��

�돫���������������¡�

  • ECC 160bit ������ RSA 1024bit�����������������ӏ��¹��������¡��������«
  • ECC 256bit ������ RSA 3072bit�����������������ӏ��¹��������¡��������«
���������������������������������������¹���̏�¡񏪣�������㏢�������«��������������¡� NIST SP800-57 Recommendation for Key Management - Part1: General������ 5.6.1������ Comparable Algorithm Strength���������о���돪�¹�����¡�RSA��¡�DSA��¡�ECC(ECDSA)��������돪�¹������ �돪�¹�������������㏢�����Ð�ޏ�Џ������½���̏���������¡� RFC 5656 Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer�������������돫⏪���Џ��·���������������¹��¡�(���³�����������������������̏��«���������¹������)

���½�����ҡ돫⏪���Џ��·�����������쏢�­���������·�����������Ï�¡�

����Ï����������돪�¹���DSARSAECDSA
80 L=1024,N=160 1024 160-223
112L=2048,N=256 2048 224-255
128L=3072,N=256 3072 256-383
192L=7680,N=384 7680 384-511
256L=15360,N=51215360512-

(·���²���1)RSA������½��Ï��¾���������������½��Ï��¾������¾��⏢�������������������������̏�����������«

�����������돢����RSA����돢����������½��Ï��¾������������¾��⏢�̏�����������������������������돫������Ï������«���«�����������Ώ��������·�����������Ï�¡�


cmp1-rsa-sign-verify

½��Ï��¾�����������������������������¡�½��Ï��¾�����������̡�µ�����򏪩��쏢����»��С���ӏ��̏��«���«���������³���������̏��������«���������������¹��¡� �����������ď�¡񏢱�돪�¹���̏��¹�����������������������叢����»�����ď�ԡ������ď�ԏ����쏢����»��С���ӏ��̏��«���«���������³���������̏��������«���������������¹��¡� ½��Ï��¾�����������������������·������������������������Java JCE���������㏢�µ���̏��²�����̏��������¹��¡�

(·���²���2)ECDSA������½��Ï��¾���������������½��Ï��¾������¾��⏢�������������������������̏�����������«

\��\���\��؏��«������ECDSA������������RSA������������µ��؏�����½��Ï��¾������¾��⏢����������½��Ï��¾��������������������� �����������돢�«���������̏�����������������������¹���̏�¡������������������Џ����������������������������������������Ï��³���������̏��������«���������������¹��¡� �����������ď�¡񏩡�ޏ���������돪�¹������secp160r1, secp160r2, secp160k1������������������ �����叢���������я�����½��������򏪤�����㏢�����������돫���������������������������¡񏢱�돪�¹���̏��¹������������������������½���������»��С���ӏ�����������𡯏��������¹���̏�¡� RSA���̏�����¾�������������돪�¹�����¡ޏ�������������¼��؏��ޏ������������������Ð���·��¡�ECDSA������������ ������������������돪�¹���̏��¹������������������������������½���������»��С���ӏ��̏��¹������������������������������������»��ӏ��̏��������«���������������¹��¡�


cmp2-ecdsa-sign-verify

(·���²���3)����ޏ������돪�¹�������������㏢����������RSA������ECDSA���������������������������̏�����������«

ECC 160bit ������RSA 1024bit�����������叢���䏩��ޏ����㏢���¡돪�¹�������������㏢�������¹��¡� ECDSA������������³��я��·��������¡�RSA������½��Ï��¾��������������������������������������㏢�������̏�¡�½��Ï��¾������¾��⏢���� ������������������������������³���������̏��������«���������������¹��¡�


cmp3-ecc160rsa

����돪�¹���̏��¹������\�ޏ��¼\¹��¡�ECC 256bit ����������ޏ����㏢����RSA 3072bit �����ҏ�����³��я��·�����������Ώ�������������¡� ½���½��̡����·��������������Џ��������������������»�����я��̏�¡񏢱�돪�¹���̏��¹�����������������������ď���̏�¡� ������¾���������RSA½��Ï��¾����������������»��С���ӏ��̏��¹���������������������������������������¹��¡� ���³���������������Ð���·��¡�ECDSA������������RSA�����叢��������������돪�¹���̏��¹�����������������������ġޏ�������������¼��؏��ޏ��������������������»�����я�¡�


cmp4-ecc256rsa

������������������

���������ޏ�����������������������������������»��С���ӏ��̏��«���«������½���������

  • RSA½��Ï��¾�������������������������������¾���������»��С���ӏ��̏��«���«������
  • ECDSA������½��Ï��¾������¾��⏢����½��Ï��¾��������������������������叢���я�����¾������·���¹������»��С���ӏ��̏��«���«������
  • ECDSA������½��Ï��¾���������������������������������»��С���ӏ��̏��«���«������
  • RSA½��Ï��¾����������¾��⏢����������¾������������»»��С���ӏ�������������ECDSA������½��Ï��¾���������������������������������»��С���ӏ��̏��«���«������
  • RSA����������������돪�¹���̏��¹�����������������������叢�������½������·¹�����Џ��̏��²�����̏�������������������¡�
  • ECDSA������RSA�����叢��������������돪�¹���̏��¹�������������������ޏ�������������¼��؏��ޏ�������������¡�
�����������������������ġ������������������·�����������Ï��«��¡򏪮��¼�ޏ��·�����������ď����������쏢�����������������«�����������ď���������������»�ߏ��������������·�����ď�¡��򏩡��䏢�������³���������؏�������¡�