ããŒãºã®åºçŸ

ãã®èšäºã¯ãèªåã®ãããžã§ã¯ããéçºãããšãã«ééããåé¡ã®1ã€ã«åœãŠãããŠããŸãã ãã®ãããžã§ã¯ãã¯ã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãŒããã¯ãã£ãåããŠãããããžãã¹ã¢ããªã±ãŒã·ã§ã³ã§ãã ãããã¯ãŒã¯ãä»ããããŒã¿éä¿¡ã®å®è£ ãšãã¬ãŒã ã®æ§ç¯åŸãã»ãŒæåã®è³ªåã«ãéä¿¡ããŒã¿ã®æå·åãå¿ èŠã§ããã æåã®å¯èœãªã¢ã«ãŽãªãºã ïŒè€æ°ããµããŒãããèšç»ïŒã¯RSAæå·åã¢ã«ãŽãªãºã ãéžæããŸããã
ãã®èšäºã§ã¯ãã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãŒããã¯ãã£ã«RSAã¢ã«ãŽãªãºã ãå®è£ ããããã®ãªãã·ã§ã³ãšãå®éã®ãããžã§ã¯ãã§ã®ãã®ãããªå®è£ ã®äŸãæ€èšããŸãã
RSAã¢ã«ãŽãªãºã ã®æŠå¿µ
ããã§ã¯ããã®ã¢ã«ãŽãªãºã ã®æ©èœã«ã€ããŠã¯èª¬æããŸããããã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãŒããã¯ãã£ã§ã®äœ¿çšæ¹æ³ã«ã€ããŠå ·äœçã«èª¬æããŸãã
ã¡ãã£ãšãã玹ä»...å®éã RSA ïŒRivest-Shamir-Adlemanã®ååã®æåã®çç¥åœ¢ïŒã¯å ¬ééµæå·ã¢ã«ãŽãªãºã ã§ãã ããã¯ãã·ã¹ãã ãå ¬ééµãšç§å¯éµã®2ã€ã®ç°ãªãããŒãçæããããšãæå³ããŸãã
- å ¬ééµã¯ãéããŠããïŒå®å šã§ãªãïŒãã£ãã«ãä»ããŠéä¿¡ãããããŒã¿ã®æå·åã«äœ¿çšãããŸãã
- ç§å¯éµã¯ææè ã«ãã£ãŠã®ã¿ä¿åãããå ¬ééµã§æå·åãããããŒã¿ã埩å·åããããã«äœ¿çšãããŸãã

ãã®æŠå¿µãäžå³ã®å³1ã«ç€ºããŸãã
ã芧ã®ãšããã éæåã«ããçæåŸã®ããŒã¯ãå¹³æã®ä¿è·ãããŠããªããã£ãã«ãä»ããŠç·æåã«éä¿¡ãããŸãã 誰ã§ã圌ãååã§ããŸããã圌ã®å©ãããªããã°ã¡ãã»ãŒãžãæå·åããããšããã§ããŸããã
ãããã£ãŠã ç·ã®ãã£ã©ã¯ã¿ãŒã¯å ¬ééµãç°¡åã«åãåãããã®éµã§ã¡ãã»ãŒãžãæå·åããŸãã
ãã®åŸã圌ã¯æå·åãããã¡ãã»ãŒãžãéæåã«éä¿¡ãã éæåã¯ç§å¯éµã䜿çšããŠè§£èªããŸãã
2人ã®äžã§ããã®ã¹ããŒã ã¯éåžžã«åçŽã§ãã ãã ãããã®ãããªã·ã¹ãã ãã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãŒããã¯ãã£äžã§ç·šæããå¿ èŠãããå Žåã¯ã以äžã§æ€èšããããã€ãã®è¿œå ã®åé¡ãçºçããŸãã
ã¯ã©ã€ã¢ã³ã-ãµãŒããŒ
ãããã£ãŠãæåã«ããŒã決å®ããŸãã èŠããŠããããã«ãã¡ãã»ãŒãžãæå·åããã«ã¯åä¿¡è ã®å ¬ééµãå¿ èŠã§ãã ãããã£ãŠããµãŒããŒã«ã¯ã¯ã©ã€ã¢ã³ãã®å ¬ééµãå¿ èŠã§ãããã¯ã©ã€ã¢ã³ãã«ã¯ãµãŒããŒã®å ¬ééµãå¿ èŠã§ãã ãããã£ãŠãããŒã¿è»¢éãéå§ããåã«ãããŒã亀æããå¿ èŠããããŸãã ãããã©ã®ããã«çºçãããããããŒã亀æããããã»ã¹ã瀺ãå³2ã§æ€èšããŸãã

1. ã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒãžã®æ¥ç¶ãéããéµã®æãçæããŸãïŒopen-secretïŒã 次ã«ããã±ããããµãŒããŒã«éä¿¡ãã ãµãŒããŒã§å ¬éããŒã転éããŸãã
2. ãµãŒããŒã¯ãã±ãããåä¿¡ãã ã¯ã©ã€ã¢ã³ãã®å ¬éããŒãèªã¿åã£ãŠä¿åããç¬èªã®ããŒãã§ãŒã³ãçæããŸãã ãã®åŸã圌ã¯ãã±ãããã¯ã©ã€ã¢ã³ãã«éä¿¡ãã ã¯ã©ã€ã¢ã³ãã§å ¬ééµã転éããŸãã
3. ã¯ã©ã€ã¢ã³ãã¯ãã±ãããåä¿¡ãã ãµãŒããŒã®å ¬ééµãèªã¿åã£ãŠä¿åããŸã ã
亀æã¯3段éã§å®äºããŸãã ããã§ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ãããè¡ã®å察åŽã«ã察è«è ã®å ¬ééµãæã¡ãŸãã ãã ããããã§ã¯ããµãŒããŒãã¯ã©ã€ã¢ã³ãçšã®ããŒãçæããæ¹æ³ã«é¢ãã2ã€ã®æ±ºå®ã®ãã¡ã®1ã€ãçŽã¡ã«éžæããå¿ èŠããããŸãã
1. ãµãŒããŒã¯ã ãã¹ãŠã® ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠ1ã€ã®ããŒãçæã ãŸã ã
2. ãµãŒããŒã¯ã åã ã® ã¯ã©ã€ã¢ã³ã ããšã«æ°ããããŒãçæããŸã ã
çããã¯ãããŒã倧ããã»ã©ãå®çšæ§ãé«ãããšãç¥ã£ãŠãããšæããŸãã ãã ããRSAã¢ã«ãŽãªãºã ã®å Žåãéµã®çæã¯äž»èŠãªèšç®ã®è€éããè¡šããããããã»ã©åçŽãªã¿ã¹ã¯ã§ã¯ãããŸããã ããã«ãã¢ã«ãŽãªãºã ã¯ãããŒã倧ããã»ã©ãããå€ãã®ããŒã¿ãéä¿¡ããå¿ èŠãããããã«èšèšãããŠããŸãã
ããšãã°ã5ãã€ãã®é·ãã®ã¡ãã»ãŒãžãéä¿¡ãã512ãããã®ããŒé·ã䜿çšãããšãæå·åãããã¡ãã»ãŒãžã¯64kãã€ãã®ãéããã«ãªããŸãã ããã¯ããã®ãããªããŒã§æå·åã§ããããŒã¿ã®æ倧éã64ã11 = 53 kBïŒãããã·ããã«11 kBã䜿çšãããïŒã§ããããã§ãã ããã«æå·åããå¿ èŠãããå Žåã¯ã53 KBã®ãããã¯ã«åå²ããŸãã ããŒ= 4096ããããååŸãããšãæå·åããã®ã¯5ãã€ãã®ã¿ã§ããã«ãããããããæå°ãããã¯ã¯512 kãã€ãã«çãããªããŸãã
ãããã£ãŠã以äžã決å®ããå¿ èŠããããŸãã
1.ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠ1ã€ã®å€§ããªããŒãçæããŸã ãããã«ãããéå°ãªãã©ãã£ãã¯ãçºçããããå€ãã®ããã»ããµãªãœãŒã¹ã䜿çšãããŸãïŒ512ããã4096ãããã®ããŒã§ã¡ãã»ãŒãžãæå·åããã®ã¯ã¯ããã«å°é£ã§ãïŒããã¡ã¢ãªãæ¶è²»ãããéçºã«è²»ããæéãå°ãªããªããŸã;
2.ãŸãã¯ã ã¯ã©ã€ã¢ã³ãããšã«å°ããªããŒãçæãããã®äœ¿çšæéãæ倧蚱容å€ãè¶ ããªãããšã確èªããŸã ïŒ512ãããããŒã®ã¯ã©ãã¯ã¯é·ãéçŸå®ã§ãããæšå¥šãããé·ãã¯å°ãªããšã1024ãããã§ãïŒã
誰ãããã®ã¢ã«ãŠã³ãã«ã€ããŠç¬èªã®èŠè§£ãæã€ããšãã§ããŸãããã©ã®ãªãã·ã§ã³ã奜ããã¯ãéçºäžã®è£œåã«å€§ããäŸåããŸãã ãã ãããã®ãããžã§ã¯ãã§ã¯ã 2çªç®ã®ãªãã·ã§ã³ã䜿çšããããšã決å®ãããŸãã ã
ããŒãçæããŠãµãŒããŒã«éä¿¡ãã
ãã®ãããžã§ã¯ãã§ã¯ãã¯ã©ã€ã¢ã³ããµãŒããŒããŒã¿ããŒã¹ãšãã3å±€ã¢ãŒããã¯ãã£ã䜿çšããŠããŸãã ãµãŒããŒã¯Javaã§èšè¿°ãããã¯ã©ã€ã¢ã³ãã¯CïŒã§èšè¿°ãããŠããŸãã 以äžã§ã¯ããµãŒããŒåŽãšã¯ã©ã€ã¢ã³ãåŽã®äž¡æ¹ã§ã®æå·åã®å®è£ ã«ã€ããŠèª¬æããŸãã ãŠãŒã¶ãŒ-ã¯ã©ã€ã¢ã³ãããå§ããŸãããã
ãããã£ãŠããµãŒããŒãžã®æ¥ç¶ã¯æåãããã±ãããåä¿¡ããæºåãæŽããŸããã ãããè¡ãã«ã¯ã.NETã¯ã©ã¹RSACryptoServiceProvider ïŒCïŒïŒã䜿çšããŠããŒãäœæããŸãã
- ãã©ã€ããŒã RSACryptoServiceProvider m_Rsa ;
- ãã©ã€ããŒã RSAParameters m_ExternKey ;
- ãã©ã€ããŒã RSAParameters m_InternKey ;
- ãããªã㯠CryptoRsa ïŒ ïŒ
- {
- m_Rsa = æ°ãã RSACryptoServiceProvider ïŒ 512 ïŒ ;
- m_InternKey = m_Rsaã ExportParameters ïŒ true ïŒ ;
- }
ãã®ãªã¹ãã«ã¯ã CryptoRsaã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸããããã¯ã512ãããããŒãèªåçã«çæããããŒãã©ã¡ãŒã¿ãŒïŒãããªãã¯ã ãã§ãªãç§å¯ããŒããšã¯ã¹ããŒãããå¿ èŠãããããšã瀺ãïŒãm_InternKeyå€æ°ã«ãšã¯ã¹ããŒãããŸãã
次ã«ãå ¬ééµããã€ã圢åŒã§ä¿åãããµãŒããŒã«éä¿¡ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãRSAããŒã®æ§æèŠçŽ ãå°ãç解ããå¿ èŠããããŸãã èŠããã«ããããã¯ãããããããªãã¯ææ°ãšã·ãŒã¯ã¬ããææ°ãããã³äž¡æ¹ã®ããŒã®åäžã¢ãžã¥ãŒã«ã§æ§æãããŠããŸãã ãããã£ãŠãå ¬ééµã¯å ¬éææ°ãšã¢ãžã¥ãŒã«ã§ãããç§å¯éµã¯ç§å¯ææ°ãšã¢ãžã¥ãŒã«ã§ãã 詳现ã«ã€ããŠã¯ããå ¬éããŒãšç§å¯ããŒãäœæããããã®ã¢ã«ãŽãªãºã ãã®ç« ãåç §ããŠãã ããã
åºåãããã¡ã«ãªãŒãã³ææ°ãæžã蟌ã¿ãŸãïŒCïŒïŒïŒ
- //ææ°ã®é·ããæžã蟌ã->ææ°->ã¢ãžã¥ãŒã«
- ããã Write ïŒ ïŒ Byte ïŒ m_InternKeyãExponentãLength ïŒ ;
- ããã æžãèŸŒã¿ ïŒ m_InternKeyãExponent ïŒ ;
- ããã Write ïŒ m_InternKeyãModulus ïŒ ;
ãã®å Žåãææ°ã®çµäºäœçœ®ãšã¢ãžã¥ãŒã«ã®éå§äœçœ®ïŒãµãŒããŒäžã®ããŒã¿ãèªã¿åããšãïŒãæ£ç¢ºã«ç¥ãããã«ãææ°ã®é·ããå¿ èŠã§ãã èšé²åŸãããŒã¿ããµãŒããŒã«éä¿¡ããŸãã
ãµãŒããŒãããŒä»ãã®ãã±ãããåä¿¡ãããããã±ããããããŒãååŸããŠä¿åããå¿ èŠããããŸãã ç§ãã¡ã¯èŠãŸãïŒJavaïŒïŒ
- //ææ°ã®é·ã
- int expLength =ãã±ããã readByte ïŒ ïŒ ;
- //ææ°ãã€ããååŸããŸã
- ãã€ã [ ]ææ°= æ°ãã ãã€ã [ expLength ] ;
- ã·ã¹ãã arraycopy ïŒ packetãBytes ãpacketãOffsetãexponentã 0 ãexpLength ïŒ ;
- //ã¢ãžã¥ãŒã«ã®ãã€ããååŸããŸã
- ãã€ã [ ]ã¢ãžã¥ã©ã¹= æ°ãã ãã€ã [ 1 +ãã±ããã ãã€ã é·ã - ïŒãã±ããã ãªãã»ãã + expLength ïŒ ] ;
- ã·ã¹ãã arraycopy ïŒ packetãBytesãpacketãOffset + expLengthãmodulusã 1 ãmodulusãlength - 1 ïŒ ;
- //ããŒãã¥ãŒããžãã¯
- ã¢ãžã¥ã©ã¹[ 0 ] = 0 ;
- //ããŒãä¿åããŸã
- RSAPublicKeySpec rsaPubKeySpec = æ°ãã RSAPublicKeySpec ïŒ æ°ãã BigInteger ïŒã¢ãžã¥ã©ã¹ïŒ ã æ°ãã BigInteger ïŒææ°ïŒ ïŒ ;
- m_ExternPublicKey = ïŒ RSAPublicKey ïŒ KeyFactory ã getInstance ïŒ "RSA" ïŒ ã generatePublic ïŒ rsaPubKeySpec ïŒ ;
ã¢ãžã¥ãŒã«ã®æåã®ãã€ãããŒãã«èšå®ãããããŒãã¥ãŒããžãã¯ããšåŒã°ããå¥åŠãªè¡ãé€ããŠãããã§ã³ãŒãã«ã€ããŠç¹ã«ã³ã¡ã³ãããå¿ èŠã¯ãªããšæããŸãã ãããŠãããã«ãããŸãïŒç§ã«ã¯ããããªãçç±ã§ãJavaã§ã®RSAã®å®è£ ã§ã¯ãããŒã¢ãžã¥ãŒã«ã¯åžžã«ãŒãããéå§ããå¿ èŠããããŸãã ãããããããã¯ã¢ãžã¥ãŒã«ã0ãã倧ããããã§ãã 倧ããªæ°ïŒBigIntegerïŒã䜿çšããŠèªåã§Javaã«RSAãå®è£ ããããšãããšãã«ãæåã®ãã€ãããŒãã«çãããªãå Žåãè² ã®æ°ãååŸãããŸãã Khabravchanyã®çŽ³å£«ããã®è³ªåãããªãã«ä»»ããŸãã誰ãããã®æ©èœã説æããŠãããããšãŠãããããã§ãã
次ã¯ããµãŒããŒã«ããããŒçæã§ãã 次ã®ã³ãŒããæ€èšããŠãã ããïŒJavaïŒïŒ
- //ããŒãžã§ãã¬ãŒã¿ãŒãååŸããŠåæåããŸã
- KeyPairGenerator keyGen = KeyPairGenerator ã getInstance ïŒ "RSA" ïŒ ;
- keyGenã åæå ïŒ ConfigãCRYPTO_KEY_NUM_BITS ïŒ ;
- //æãçæããŸã
- m_KeyPair = keyGenã genKeyPair ïŒ ïŒ ;
- //å ¬ééµãšç§å¯éµãååŸããŸã
- m_InternPublicKey = ïŒ RSAPublicKey ïŒ KeyFactory ã getInstance ïŒ "RSA" ïŒ ã generatePublic ïŒ
- new X509EncodedKeySpec ïŒ m_KeyPairãgetPublic ïŒ ïŒ ã getEncoded ïŒ ïŒ ïŒ ïŒïŒ ;
- m_InternPrivateKey = ïŒ RSAPrivateKey ïŒ KeyFactory ã getInstance ïŒ "RSA" ïŒ ã generatePrivate ïŒ
- new PKCS8EncodedKeySpec ïŒ m_KeyPairãgetPrivate ïŒ ïŒ ã getEncoded ïŒ ïŒ ïŒ ïŒïŒ ;
ããã§ã¯ãã¹ãŠãæ確ã ãšæããŸãã ãã¡ããããã£ãšæ·±ãæãäžããå Žåã¯ã X509ãPKCS8 ïŒX509EncodedKeySpecããã³PKCS8EncodedKeySpecïŒãªã©ã®ã¯ãªãŒãã£ãŒã®äž»é¡ãã°ãŒã°ã«ã§æ€çŽ¢ããå¿ èŠããããŸãã
次ã®ã¹ãããã¯ãããŒããµãŒããŒã«éä¿¡ããããšã§ãã ããã¯ãã¯ã©ã€ã¢ã³ãïŒJavaïŒã®å Žåãšã»ãŒåãæ¹æ³ã§è¡ãããŸãã
- //ææ°ã®é·ããæžã蟌ã->ææ°->ã¢ãžã¥ãŒã«
- ããªã write ïŒ exponentãlength ïŒ 0xff ïŒ ; //ãã€ããšããŠæžã蟌ã
- ããªã æžããŸã ïŒææ°ïŒ ;
- ããªã æžã蟌㿠ïŒã¢ãžã¥ã©ã¹ïŒ ;
ãããŠæåŸã«ãã¯ã©ã€ã¢ã³ãåŽã§ããŒãååŸããèªã¿åããä¿åããŸãïŒCïŒïŒïŒ
- ãã€ã expLength =ãã±ããã ReadByte ïŒ ïŒ ;
- ãã€ã [ ]ææ°= æ°ãã ãã€ã [ expLength ] ;
- ç·©è¡æ¶² BlockCopy ïŒ packetãBytes ãpacketãOffsetãexponentã 0 ãexpLength ïŒ ;
- ãã€ã [ ]ã¢ãžã¥ã©ã¹= æ°ãã ãã€ã [ãã±ããã ãã€ã é·ã - ïŒãã±ããã ãªãã»ãã + expLength ïŒ -1 ] ;
- ç·©è¡æ¶² BlockCopy ïŒãã±ããã ãã€ã ããã±ããã ãªãã»ãã + expLength + 1 ãã¢ãžã¥ã©ã¹ã 0 ãã¢ãžã¥ã©ã¹ã é·ã ïŒ ;
- m_ExternKey = new RSAParameters ïŒ ïŒ ;
- m_ExternKeyã ææ° =ææ°;
- m_ExternKeyã ã¢ãžã¥ã©ã¹ =ã¢ãžã¥ã©ã¹;
å®éãããããã¹ãŠã§ãã ããã§ãã¯ã©ã€ã¢ã³ãã¯å€æ°m_ExternKeyã«ãµãŒããŒã®å ¬ééµãæã¡ããµãŒããŒã¯å€æ°m_ExternPublicKeyã«ã¯ã©ã€ã¢ã³ãã®å ¬ééµãæã¡ãŸãã ããŒã¿è»¢éèªäœãæŽçããããã ãã«æ®ããŸãã ããã¯ããã«ç°¡åã«ãªããŸãïŒCïŒïŒïŒ
- //ããŒãã€ã³ããŒãããŸã
- m_Rsaã ImportParameters ïŒ m_ExternKey ïŒ ;
- //æå·åãããããŒã¿ãæå·åãããããã¡ã«æžã蟌ã¿ãŸã
- ãããã¡ã æžãèŸŒã¿ ïŒ m_RsaãEncrypt ïŒ bytesToEncryptã false ïŒ ïŒ ;
ãµãŒããŒã®å Žåãããå°ãè€éã§ãïŒJavaïŒïŒ
- byte [ ] cipherText = null ;
- æå·cipher =æå·ã getInstance ïŒ "RSA / ECB / PKCS1Padding" ïŒ ;
- æå·ã init ïŒæå·ãENCRYPT_MODEãm_ExternPublicKey ïŒ ;
- cipherText =æå·ã doFinal ïŒ tempBytes ïŒ ;
- ããªã æžãèŸŒã¿ ïŒ cipherText ïŒ ;
æå·åãããã¡ãã»ãŒãžã¯ãåä¿¡è ãç§å¯éµã䜿çšããŠéä¿¡ããã³åŸ©å·åããæºåãã§ããŠããŸãã å¿ããŠã¯ãªããªãå¯äžã®ããšã¯ãæå·åã§ããæ倧ã¡ãã»ãŒãžãµã€ãºãããŒãµã€ãºãã11ãã€ããåŒãããã®ã«çããããšã§ãã ãããã£ãŠãæå·åãããšãã¯ãããŒã¿ããããã¯ã«åå²ããŠé çªã«æå·åããå¿ èŠããããŸãã CïŒã®äŸã次ã«ç€ºããŸãã
- m_Rsaã ImportParameters ïŒ m_ExternKey ïŒ ;
- ByteBuffer buffer = new ByteBuffer ïŒ ïŒ ;
- int dataLength = bytesToEncryptã é·ã ;
- int maxLength = ïŒ m_RsaãKeySize / 8 ïŒ -12 ;
- int iterations = ïŒ int ïŒæ°åŠã å€©äº ïŒ ïŒ ãããŒã ïŒ bytesToEncryptã é·ã / maxLength ïŒ ;
- for ïŒ Int32 i = 0 ; i <ç¹°ãè¿ã; i ++ ïŒ
- {
- ãã€ã [ ] tempBytes = æ°ãã ãã€ã [
- ïŒ dataLength - maxLength * i > maxLength ïŒ ïŒ maxLength ïŒ
- dataLength - maxLength * i ] ;
- ç·©è¡æ¶² BlockCopy ïŒ bytesToEncryptãmaxLength * iãtempBytesã 0 ã
- tempBytesã é·ã ïŒ ;
- ãããã¡ã PutEnd ïŒ m_RsaãEncrypt ïŒ tempBytesã false ïŒ ïŒ ;
- }
- æ»ããããã¡ã é å
èªåã§Javaã«å®è£ ããŸããããã€ãã®å€æŽããããŸã:)
ãã¡ããããã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ããã®æ©èœã®å®è£ ã®ç¯å²å šäœãã«ããŒããããšã¯ã§ããŸããããRSAã¢ã«ãŽãªãºã ã䜿çšããŠã¯ã©ã€ã¢ã³ãã«å®å šãªãã£ãã«ãå®è£ ããæ¹æ³ã«ã€ããŠã®ã¢ã€ãã¢ã¯ééããªããããšæããŸãã