Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
×î¼Ñ°²È«Êµ¼ù£ºÔÚ Java ºÍ Android ÖÐʹÓà AES ½øÐжԳƼÓÃÜ
 
  1662  次浏览      31
 2018-12-28
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÍøÂ磬 ±¾ÎÄÖÐΪ´ó¼Ò½éÉܸ߼¶¼ÓÃܱê×¼£¨AES£©£¬³£¼û¿éģʽ£¬ÎªÊ²Ã´ÐèÒªÌî³äºÍ³õʼ»¯ÏòÁ¿ÒÔ¼°ÈçºÎ±£»¤Êý¾Ý²»±»´Û¸Ä.

Ϊʲôÿһ¸öÈí¼þ¹¤³Ìʦ¶¼ÐèÒªÖªµÀ AES

AES£¬ÓÖ³Æ Rijndael ¼ÓÃÜËã·¨£¬ÔÚ 2000 Äê±» NIST Ñ¡ÖÐÒÔÓÃÀ´Ìæ»»¹ýʱµÄÊý¾Ý¼ÓÃܱê×¼£¨DES£©¡£AES ÊÇÒ»ÖÖ·Ö×éÃÜÂ룬ÕâÒâζ׿ÓÃÜ·¢ÉúÔڹ̶¨³¤¶ÈµÄ±ÈÌØ×éÉÏ¡£ÔÚÎÒÃǵÄÀý×ÓÖУ¬Ëã·¨¶¨Òå¿é³¤¶ÈΪ 128 λ¡£AES Ö§³Ö 128£¬192 ºÍ 256 λµÄÃÜÔ¿³¤¶È¡£

ÿ¸ö¿é¶¼¾­Àú¶àÂÖת»»¡£ÎÒ½«ÔÚÕâÀïÊ¡ÂÔËã·¨µÄϸ½Ú£¬¶ÔËã·¨¸ÐÐËȤµÄ¶ÁÕß¿ÉÒԲο¼Î¬»ù°Ù¿ÆÖÐÓÐ¹Ø AES µÄÎÄÕ¡£ÕâÀïÐèÒªÖ¸³öµÄÊÇ¿é´óСÊÜת»»ÂִεÄÖØ¸´´ÎÊýÓ°Ï죨128 λÃÜÔ¿ÊÇ 10 ¸öÖÜÆÚ£¬256 λΪ 14 ¸öÖÜÆÚ£©£¬¶øÃÜÔ¿³¤¶È²¢²»Ó°ÏìËüµÄ´óС¡£

Ò»Ö±µ½ 2009 Äê 5 Ô£¬Î¨Ò»Ò»´Î³É¹¦·¢²¼£¬Õë¶ÔÍêÕû AES µÄ¹¥»÷ÊǶÔÄ³Ð©ÌØ¶¨ÊµÏÖµÄÅÔµÀ¹¥»÷¡££¨×ÊÔ´£©

ÏëÒª¼ÓÃܶà¸ö¿é£¿

AES Ö»»á¼ÓÃÜ 128 λÊý¾Ý£¬Èç¹ûÎÒÃÇÏëÒª¼ÓÃÜÕû¸öÏûÏ¢£¬ÎÒÃÇÐèҪѡÔñÒ»ÖÖ¿éģʽ£¬ÀûÓøÃģʽ¿ÉÒÔ½«¶à¸ö¿é¼ÓÃÜΪһ¸öÃÜÎÄ¡£×î¼òµ¥µÄ¿éģʽÊǵç×ÓÃÜÂë±¾»ò ECB¡£Ëü½«ÔÚÿ¸öÇø¿éÖÐʹÓÃÏàͬµÄδ¸ü¸ÄµÄ¼ü£º

ͼƬÀ´×Ôά»ù°Ù¿Æ

Õ⽫ÊÇÌØ±ðÔã¸âµÄ£¬ÒòΪÏàͬµÄÃ÷ÎĻᱻ¼ÓÃܳÉÏàͬµÄÃÜÎÄ¡£

ʹÓà ECB ¿éģʽ¼ÓÃܵÄͼƬÏÔʾԭʼͼ°¸£¨×Ô¼º³¢ÊÔһϵã»÷Ô¤ÀÀ£©

Çë¼Çס£¬³ý·ÇÄãÖ»¼ÓÃÜСÓÚ 128 λµÄÊý¾Ý£¬·ñÔòÓÀÔ¶²»ÒªÑ¡Ôñ¸Ãģʽ¡£²»ÐÒµÄÊÇ£¬ËüÈÔÈ»±»¾­³£ÎóÓã¬ÒòΪËü²»ÐèÒªÄãÌṩ³õʼÏòÁ¿£¨ÉÔºó»áÏêϸ½éÉÜ£©£¬Òò´Ë¿ª·¢ÈËÔ±ËÆºõ¸üÈÝÒ×´¦Àí¡£

±ØÐëʹÓÿéģʽ´¦ÀíµÄÒ»ÖÖÇé¿ö£ºÈç¹û×îºóÒ»¸ö¿éµÄ´óС²»×ã 128 λ»á·¢Éúʲô£¿Õâ¾ÍÊÇÌî³ä·¢»Ó×÷Óõĵط½£¬¼´Ìî³ä¿éµÄȱʧλ¡£×î¼òµ¥µÄ·½Ê½ÊÇÓÃÁãÌî³äȱʧλ¡£ÔÚ AES ÖÐÑ¡ÔñÌî³ä¼¸ºõûÓÐÈκΰ²È«Òþ»¼¡£

ÃÜÂë·Ö×éÁ´½Ó£¨CBC£©

ÄÇôÓÐʲô·½°¸¿ÉÒÔÌæ´ú ECB ÄØ£¿ÀýÈç CBC£¬ÔÚ¸ÃģʽÖУ¬Óõ±Ç°µÄÃ÷ÎÄ¿éºÍǰһ¸öÃÜÎÄ¿é½øÐÐÒì»ò¡£Ôڸ÷½·¨ÖУ¬Ã¿¸öÃÜÎĿ鶼ÒÀÀµÓÚËüÇ°ÃæµÄËùÓÐÃ÷ÎĿ顣ʹÓÃÓë֮ǰÏàͬµÄͼƬ£¬¼ÓÃܽá¹û½«ÊÇÓëÔëÉùÊý¾ÝÎÞ·¨Çø·ÖµÄËæ»úÊý¾Ý£º

ʹÓà CBC ¿éģʽ¼ÓÃܵÄͼƬ¿´ÆðÀ´ÊÇËæ»úµÄ

ÄÇÈçºÎ´¦ÀíµÚÒ»¸ö¿éÄØ£¿×î¼òµ¥µÄ·½·¨ÊÇʹÓÃÒ»¸öÍêÕûµÄÌî³ä¿é£¨±ÈÈçÓÃÁãÌî³ä£©£¬µ«ÕâÑùÿ´Î¼ÓÃÜÏàͬÃÜÔ¿ºÍÃ÷Îͼ»á²úÉúÒ»ÑùµÄÃÜÎÄ¡£´ËÍ⣬Èç¹ûÄãΪ²»Í¬µÄÃ÷ÎÄÖØÓÃÏàͬµÄÃÜÔ¿£¬ÄÇô»Ö¸´ÃÜÔ¿½«»á¸ü¼ÓÈÝÒס£¸üºÃµÄ·½·¨ÊÇʹÓÃËæ»ú³õʼ»¯ÏòÁ¿£¨IV£©¡£Õâ¶ÔÓÚËæ»úÊý¾ÝÀ´ËµÖ»ÊÇÒ»¸öÆæÌØµÄ´Ê£¬´óÔ¼ÊÇÒ»¸ö¿é£¨128 룩´óС¡£½«ËüÏëÏó³ÉÒ»¸ö¼ÓÃÜµÄ salt£¬Ò²¾ÍÊÇ˵£¬IV ÊÇ¿ÉÒÔ¹«¿ªµÄ£¬Ëæ»úµÄÇÒÖ»ÄÜʹÓÃÒ»´Î¡£µ«Çë×¢Ò⣬ÒòΪ CBC ½«ÃÜÎÄÒì»ò¶ø²»ÊÇǰһ¸öÃ÷ÎĵÄÃ÷ÎÄ£¬Òò´Ë IV ²»½ö½ö»á×èÖ¹µÚÒ»¸ö¿éµÄ½âÃÜ¡£

ÔÚ´«Êä»ò±£³ÖÊý¾Ýʱ£¬Í¨³£Ö»½« IV Ìí¼Óµ½Êµ¼ÊµÄÃÜÂëÏûÏ¢ÖС£Èç¹ûÄã¶ÔÈçºÎÕýȷʹÓà AES-CBC ¸ÐÐËȤ£¬ÇëÔĶÁ±¾ÏµÁÐµÄµÚ 2 ²¿·Ö¡£

¼ÇÊýģʽ£¨CTR£©

ÁíÍâÒ»ÖÖÑ¡ÔñÊÇʹÓà CTR ģʽ¡£ÕâÖÖģʽºÜÓÐÒâ˼£¬ÒòΪËü»á½«ÃÜÂëת»»ÎªÃÜÂëÁ÷£¬ÕâÒâζ×Ų»ÐèÒª½øÐÐÌî³ä¡£ÔÚÆä»ù±¾ÐÎʽÖУ¬ËùÓпéµÄ±àºÅΪ 0 µ½ n¡£ÏÖÔÚÿ¸ö¿é¶¼½«Ê¹ÓÃÃÜÔ¿¡¢IV£¨´Ë´¦Ò²³ÆÎª nonce£©ºÍ¼ÆÊýÆ÷µÄÖµÀ´½øÐмÓÃÜ¡£

ͼƬÀ´×Ôά»ù°Ù¿Æ

Óë CBC ²»Í¬£¬ËüµÄÓŵãÊÇ¿ÉÒÔ½øÐв¢ÐмÓÃܲ¢ÇÒËùÓп鶼ÒÀÀµÓÚ IV£¬¶ø²»½ö½öÊǵÚÒ»¸ö¡£Ò»¸öºÜÑÏÖØµÄ¾¯¸æÊÇ£¬IV ÓÀÔ¶²»Äܱ»ÏàͬµÄÃÜÔ¿ÖØÓã¬ÒòΪ¹¥»÷Õß¿ÉÒÔ´ÓÖÐÇáËɼÆËã³öÄãËùʹÓõÄÃÜÔ¿¡£

ÎÒ¿ÉÒÔÈ·±£Ã»ÓÐÈËÄܹ»ÐÞ¸ÄÎÒµÄÏûÏ¢Âð£¿

ÊÂʵ£º¼ÓÃܲ»»á×Ô¶¯·ÀÖ¹Êý¾ÝÐ޸ġ£Õâʵ¼ÊÉÏÊÇÒ»Öַdz£³£¼ûµÄ¹¥»÷¡£ÓйظÃÎÊÌâ¸üÈ«ÃæµÄÌÖÂÛ£¬ÇëÔĶÁ´ËÎÄ¡£

ÄÇôÎÒÃÇÓÖÄÜ×öÐ©Ê²Ã´ÄØ£¿ÎÒÃÇÖ»Ð轫¼ÓÃÜÑéÖ¤Â루MAC£©Ìí¼Óµ½¼ÓÃÜÓʼþÖС£MAC ÀàËÆÓÚÊý×ÖÇ©Ãû£¬²»Í¬Ö®´¦ÔÚÓÚÑéÖ¤ºÍÑéÖ¤ÃÜԿʵ¼ÊÉÏÊÇÏàͬµÄ¡£ÕâÖÖ·½·¨Óв»Í¬µÄ±ä»¯£¬´ó¶àÊýÑо¿ÈËÔ±ÍÆ¼öµÄģʽ½Ð×ö Encrypt-then-Mac ¡£Ò²¾ÍÊÇ˵£¬ÔÚ¼ÓÃÜÖ®ºó£¬ÔÚÃÜÎÄÉϼÆËã²¢¸½¼Ó MAC¡£Äãͨ³£»áʹÓûùÓÚ¹þÏ£µÄÏûÏ¢Éí·ÝÑéÖ¤´úÂ루HMAC£©×÷Ϊ MAC µÄÀàÐÍ¡£

ÏÖÔÚËü¿ªÊ¼±äµÃ¸´ÔÓÁË¡£ÎªÁËÍêÕûÐÔ/ÕæÊµÐÔÎÒÃDZØÐëÑ¡Ôñ MAC Ëã·¨£¬Ñ¡Ôñ¼ÓÃܱêǩģʽ£¬¼ÆËã mac ²¢¸½¼ÓËü¡£ÒòΪÕû¸öÏûÏ¢±ØÐë´¦ÀíÁ½´Î£¬ËùÒԸòÙ×÷ÔËÐÐËÙ¶È»ºÂý¡£·´Ïò²Ù×÷±ØÐëÓëÇ°ÃæÒ»Ö£¬µ«ÓÃÓÚ½âÃܺÍÑéÖ¤¡£

ʹÓà GCM ½øÐÐÈÏÖ¤¼ÓÃÜ

Èç¹ûÓÐģʽ¿ÉÒÔ´¦ÀíËùÓеÄÉí·ÝÑéÖ¤£¬ÄDz»ÊǺܺÃÂð£¿ÐÒÔ˵ÄÊÇÓÐÒ»ÖÖ³ÆÎªÈÏÖ¤¼ÓÃܵļÓÃÜ·½Ê½£¬ËüͬʱΪÊý¾ÝµÄ»úÃÜÐÔ¡¢ÍêÕûÐÔºÍÕæÊµÐÔÌṩÁ˱£Ö¤¡£Ö§³Ö´Ë¹¦ÄÜ×îÁ÷ÐеĿéģʽ֮һΪ Galois/Counter Mode or GCM£¨±ÈÈçËü¿ÉÒÔʹÓà TLS v1.2 ÖеÄÃÜÂë×é¼þ£©¡£

GCM »ùÓÚ CTR ģʽ£¬Ëü»¹ÔÚ¼ÓÃÜÆÚ¼ä˳Ðò¼ÆËãÉí·ÝÑéÖ¤±ê¼Ç¡£È»ºó¸Ã±ê¼Çͨ³£»á¸½¼Óµ½ÃÜÎÄÖС£ËüµÄ´óСÊÇÒ»¸öÖØÒªµÄ°²È«ÊôÐÔ£¬Òò´ËËüµÄ³¤¶ÈÖÁÉÙÊÇ 128 λ¡£

Ëü»¹¿ÉÒÔÑé֤δ°üÀ¨ÔÚÃ÷ÎÄÖеĸ½¼ÓÐÅÏ¢¡£¸ÃÊý¾Ý³ÆÎª¹ØÁªÊý¾Ý¡£ÕâΪʲôÓÐÓÃÄØ£¿ÀýÈ磬¼ÓÃÜÊý¾Ý¾ßÓÐÔªÊôÐÔ£¬¼´ÓÃÓÚ¼ì²éÊÇ·ñ±ØÐëÖØÐ¼ÓÔØÄÚÈݵĴ´½¨ÈÕÆÚ¡£¹¥»÷Õß¿ÉÒÔÇáËɸü¸Ä´´½¨ÈÕÆÚ£¬µ«Èç¹û½«ÆäÌí¼ÓΪ¹ØÁªÊý¾Ý£¬ CGM ½«ÑéÖ¤´ËÐÅÏ¢²¢Ê¶±ð³ö¸ü¸Ä¡£

¼¤ÁÒµÄÌÖÂÛ£ºÊ¹Óö೤µÄÃÜÔ¿£¿

Ö±¾õ»á˵£ºÔ½´óÔ½ºÃ - ºÜÃ÷ÏÔ£¬Ç¿ÖÆ 256 Î»Ëæ»úÖµ±È 128 λ¸üÄÑ¡£¸ù¾ÝÎÒÃÇĿǰµÄÀí½â£¬Ç¿ÖÆÍ¨¹ý 128 볤×Ö½ÚµÄËùÓÐÖµ¶¼ÐèÒªÌìÎÄÊýÁ¿µÄÄÜÁ¿£¬¶ÔÓÚÈκÎÔÚºÏÀíʱ¼äÄÚµÄÈËÀ´Ëµ¶¼ÊDz»ÏÖʵµÄ£¨¿´×ÅÄ㣬NSA£©¡£Òò´Ë£¬¾ö¶¨»ù±¾ÉÏÔÚÎÞÏÞºÍÎÞÏÞʱ¼ä 212? Ö®¼ä¡£

AES ʵ¼ÊÉÏÓÐÈýÖÖ²»Í¬µÄÃÜÔ¿´óС£¬ÒòΪËü±»Ñ¡ÎªÃÀ¹úÁª°îÕþ¸®µÄ±ê×¢¼ÓÃÜËã·¨ÒÔÓÃÓÚÁª°îÕþ¸®¡¸°üÀ¨¾ü·½¡¹¿ØÖƵĸ÷¸öÁìÓò¡££¨...£©Òò´Ë£¬¾«Ã÷µÄ¾üÊÂÊ×ÄÔÌá³öÁËÓ¦¸ÃÓÐÈý¸ö¡°°²È«¼¶±ð¡±µÄÏë·¨£¬ÒÔ±ãʹÓÃÖØÁ¿¼¶·½·¨¼ÓÃÜ×îÖØÒªµÄÃØÃÜ£¬µ«½ÏµÍ¼ÛÖµµÄÊý¾Ý¿ÉÒÔÓøüʵÓ㬸üÇáÁ¿¼¶µÄËã·¨¼ÓÃÜ¡££¨...£©Òò´Ë£¬NIST ¾ö¶¨Õýʽ×ñÊØ¹æ¶¨£¨ÒªÇóÈý¸ö¹Ø¼ü³ß´ç£©£¬µ«Ò²Òª×öǰհÐÔµÄÊ£¨×îµÍ¼¶±ð±ØÐëͨ¹ý¿ÉÓö¼ûµÄ¼¼Êõ²»¿É¹¥ÆÆ£©£¨À´Ô´£©¡£

ÂÛµãÈçÏ£ºAES ¼ÓÃÜÏûÏ¢¿ÉÄܲ»»á±»±©Á¦ÆÆ»µÃÜÔ¿ÆÆ»µ£¬¶øÊÇͨ¹ýÆäËû½Ï±ãÒ˵Ĺ¥»÷£¨µ±Ç°Î´Öª£©¡£ÕâЩ¹¥»÷¶ÔÓÚ 128 λÃÜԿģʽºÍ 256 λģʽһÑùÓк¦£¬Òò´ËÔÚÕâÖÖÇé¿öÏÂÑ¡Ôñ¸ü´óµÄÃÜÔ¿´óСҲÎÞ¼ÃÓÚÊ¡£

ËùÒÔ»ù±¾ÉÏ 128 λÃÜÔ¿¶ÔÓÚ´ó¶àÊýÓÃÀýÀ´Ëµ¶¼×ã¹»°²È«£¬µ«Á¿×Ó¼ÆËã»ú±£»¤³ýÍ⡣ͬÑùʹÓÃ±È 256 λ¸ü¿ìµÄ 128 λ¼ÓÃÜ¡£128 λÃÜÔ¿µÄÃÜÔ¿Ç¿¶ÈËÆºõ¿ÉÒÔ¸üºÃµÄ·ÀÖ¹Ïà¹ØÃÜÔ¿¹¥»÷£¨µ«ÕâÓë´ó¶àÊýʵ¼ÊÓÃ;Î޹أ©¡£

ÅÔ×¢£ºÅÔµÀ¹¥»÷

ÅÔµÀ¹¥»÷ÊÇÀûÓÃÌØ¶¨ÓÚijЩʵÏÖµÄÎÊÌâµÄ¹¥»÷¡£¼ÓÃÜÃÜÂë·½°¸±¾Éí²»ÄÜÓÐЧµØ±£»¤ËüÃÇ¡£¼òµ¥µÄ AES ʵÏÖ¿ÉÄÜÈÝÒ×·¢Éú¼ÆÊ±£¬»º´æ¹¥»÷¼°ÆäËû¹¥»÷¡£

×÷Ϊһ¸ö·Ç³£»ù±¾µÄÀý×Ó£ºÒ»¸öÈÝÒ×·¢Éú¶¨Ê±¹¥»÷µÄ¼òµ¥Ëã·¨ÊÇÒ»¸ö±È½ÏÁ½¸öÃØÃÜ×Ö½ÚÊý×éµÄ equals() ·½·¨¡£Èç¹û equals() ÓÐÒ»¸ö¿ìËÙ·µ»Ø£¬Òâζ×ÅÔÚµÚÒ»¶Ô²»Æ¥ÅäµÄ×Ö½Ú½áÊøÑ­»·Ö®ºó£¬¹¥»÷Õß¿ÉÒÔ²âÁ¿ equals() Íê³ÉËùÐèÒªµÄʱ¼ä£¬²¢ÇÒ¿ÉÒÔÒ»¸ö×Ö½ÚÒ»¸ö×ֽڵIJ²⣬ֱµ½È«²¿Æ¥ÅäΪֹ¡£

ʹÓÿìËÙ·µ»Ø¿ÉÄÜÊܵ½¶¨Ê±¹¥»÷µÄ´úÂë

ÔÚÕâÖÖÇé¿öÏ£¬Ò»¸öÐÞ¸´·½·¨ÊÇʹÓú㶨ʱ¼äµÈÓÚ¡£Çë×¢Ò⣬ÔÚÀàËÆÓÚ JVM µÈ½âÊÍÓïÑÔÖбàд³£Á¿Ê±¼ä´úÂëÍùÍù²¢·ÇÒ×Ê¡£

Õë¶Ô AES µÄ¶¨Ê±ºÍ»º´æ¹¥»÷²»½ö½öÊÇÀíÂÛÉϵģ¬ÉõÖÁ¿ÉÒÔͨ¹ýÍøÂç½øÐÐʵʩ¡£ËäÈ»·ÀÖ¹ÅÔµÀ¹¥»÷Ö÷ÒªÊÇʵʩ¼ÓÃÜÔ­ÓïµÄ¿ª·¢ÈËÔ±¹Ø×¢µÄÎÊÌ⣬µ«Á˽â±àÂëʵ¼ù¿ÉÄܶÔÕû¸öÀý³ÌµÄ°²È«ÐÔÓк¦ÊÇÃ÷Öǵġ£×îÒ»°ãµÄÖ÷ÌâÊÇ£¬¿É¹Û²ìµ½µÄÓëʱ¼äÏà¹ØµÄÐÐΪ²»Ó¦¸ÃÒÀÀµÓÚ˽ÃÜÊý¾Ý¡£´ËÍ⣬ÄãÓ¦¸Ã×Ðϸ¿¼ÂÇҪѡÔñµÄʵÏÖ·½°¸¡£ÀýÈ磬ʹÓôøÓÐ OpenJDK µÄ Java 8+ ºÍĬÈ쵀 JCA Ìṩ³ÌÐòÓ¦¸ÃÔÚÄÚ²¿Ê¹Óà Intel µÄ AES-NI Ö¸Á£¬¸ÃÖ¸Áͨ¹ýºã¶¨Ê±¼äºÍÔÚÓ²¼þÖÐʵÏÖ£¨Í¬Ê±ÈÔ¾ßÓÐÁ¼ºÃµÄÐÔÄÜ£©À´·ÀÖ¹´ó¶àÊýʱÐòºÍ»º´æ¹¥»÷¡£Android ʹÓÃËüµÄ AndroidOpenSSLProvider£¬ÄÚ²¿¿ÉÄÜ»áÔÚÓ²¼þÖÐʹÓà AES£¨ARM TrustZone£©£¬¾ßÌåÈ¡¾öÓÚ SoC¡£µ«ÎÒ²»ÏàÐÅËü¾ßÓÐÓë Intels pedant ÏàͬµÄ·À»¤¡£µ«¼´Ê¹Äã¸Ä½øÓ²¼þ£¬Ò²¿ÉÒÔʹÓÃÆäËû¹¥»÷ÏòÁ¿£¬ÀýÈ繦ÂÊ·ÖÎö¡£´æÔÚרÃÅÓÃÓÚ·ÀÖ¹´ó¶àÊýÕâЩÎÊÌâµÄרÓÃÓ²¼þ£¬¼´Ó²¼þ°²È«Ä£¿é£¨HSM£©¡£²»ÐÒµÄÊÇ£¬ÕâЩÉ豸µÄ³É±¾Í¨³£¸ß´ïÊýǧÃÀÔª£¨ÓÐȤµÄÊÇ£ºÄãµÄ»ùÓÚоƬµÄÐÅÓÿ¨Ò²ÊÇ HSM£©¡£

ÔÚ Java ºÍ Android ÖÐʵÏÖ AES-GCM

×îºóËü±äµÃʵÓÃÁË¡£ÏÖÔÚ Java ÓµÓÐÎÒÃÇÐèÒªµÄËùÓй¤¾ß£¬µ«¼ÓÃÜ API ¿ÉÄܲ»ÊÇ×îÖ±½ÓµÄ¡£Ï¸ÐĵĿª·¢ÈËÔ±Ò²¿ÉÄܲ»È·¶¨ÒªÊ¹Óõij¤¶È/´óС/ĬÈÏÖµ¡£×¢Ò⣺Èç¹ûûÓÐ˵Ã÷£¬ËùÓÐÄÚÈݶ¼Í¬ÑùÊÊÓÃÓÚ Java ºÍ Android¡£

ÔÚÎÒÃǵÄʾÀýÖУ¬ÎÒÃÇʹÓÃËæ»úÉú³ÉµÄ 128 λÃÜÔ¿¡£´«µÝ 192 ºÍ 256 볤¶ÈµÄÃÜԿʱ£¬Java »á×Ô¶¯Ñ¡ÔñÕýÈ·µÄģʽ¡£µ«Çë×¢Ò⣬256 λ¼ÓÃÜͨ³£ÐèÒªÔÚ JRE Öа²×° ÎÞÕþ²ßÏÞÖÆÈ¨ÏÞÎļþ£¨AndroidÖÐÊǺõģ©¡£

SecureRandom secureRandom = new SecureRandom();
byte[] key = new byte[16];
secureRandom.nextBytes(key);
SecretKey secretKey = SecretKeySpec(key, ¡°AES¡±);

È»ºóÎÒÃDZØÐë´´½¨ÎÒÃǵijõʼ»¯ÏòÁ¿¡£¶ÔÓÚ CGM£¬NIST ½¨ÒéʹÓà 12 ×Ö½Ú£¨·Ç16×Ö½Ú£¡£©Ëæ»ú×ÖÊý×飬ÒòΪËü¸ü¿ì£¬¸ü°²È«¡£Çë×¢ÒâʼÖÕʹÓÃÏñ SecureRandom ÕâÑùµÄÇ¿Î±Ëæ»úÊýÉú³ÉÆ÷£¨RNG£©¡£

byte[] iv = new byte[12]; //NEVER REUSE THIS IV WITH SAME KEY
secureRandom.nextBytes(iv);

È»ºó³õʼ»¯ÄãµÄÃÜÂë¡£AES-GCM ģʽӦ¸ÃÊÊÓÃÓÚ´ó¶àÊýÏÖ´ú JRE ºÍ Android v2.3 ÒÔÉϰ汾£¨ËäÈ»½öÔÚ SDK 21+ ÉÏ¿ÉÒÔÍêÈ«Õý³£ÔËÐУ©¡£Èç¹ûÅöÇɲ»¿ÉÓã¬Çë°²×°Ïñ BouncyCastle ÕâÑùµÄ×Ô¶¨Òå¼ÓÃÜÌṩ³ÌÐò£¬µ«Í¨³£Ê×ѡĬÈÏÌṩ³ÌÐò¡£ÎÒÃÇÑ¡Ôñ 128 λ´óСµÄÈÏÖ¤±êÇ©¡£

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv); //128 bit auth tag length
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);

Èç¹ûÐèÒª£¬Ìí¼Ó¿ÉÑ¡µÄ¹ØÁªÊý¾Ý£¨ÀýÈçÔªÊý¾Ý£©

if (associatedData != null) {
cipher.updateAAD(associatedData);
}

¼ÓÃÜ£»Èç¹ûÄãÕýÔÚ¼ÓÃÜ´ó¿éÊý¾Ý£¬ÇëÑо¿ CipherInputStream£¬ÕâÑùÕû¸öÄÚÈݾÍÎÞÐè¼ÓÔØµ½¶ÑÖС£

byte[] cipherText = cipher.doFinal(plainText);

ÏÖÔÚ½«ËùÓÐÄÚÈÝÁ¬½Óµ½Ò»ÌõÏûÏ¢¡£

ByteBuffer byteBuffer = ByteBuffer.allocate(4 + iv.length + cipherText.length);
byteBuffer.putInt(iv.length);
byteBuffer.put(iv);
byteBuffer.put(cipherText);
byte[] cipherMessage = byteBuffer.array();

Èç¹ûÄãÐèÒª×Ö·û´®±íʾ£¬¿ÉÑ¡Óà Base64 À´±àÂëËü¡£ Android ÖÐÓиñàÂëµÄ±ê׼ʵÏÖ£¬JDK ½ö´Ó°æ±¾ 8 ¿ªÊ¼£¨Èç¹û¿ÉÄÜ£¬ÎÒ»á±ÜÃâʹÓà Apache Commons Codec£¬ÒòΪËüºÜÂýÇÒʵÏÖ»ìÂÒ£©¡£

Õâ»ù±¾ÉϾÍÊǼÓÃÜ¡£ÎªÁ˹¹ÔìÏûÏ¢£¬IV ³¤¶È£¬IV£¬¼ÓÃÜÊý¾ÝºÍÈÏÖ¤±êÇ©±»¸½¼Óµ½µ¥¸ö×Ö½ÚÊý×é¡££¨ÔÚ Java ÖУ¬Éí·ÝÑéÖ¤±ê¼Ç»á×Ô¶¯¸½¼Óµ½ÏûÏ¢ÖУ¬ÎÞ·¨Ê¹Óñê×¼¼ÓÃÜ API ×ÔÐд¦Àí£©¡£

×î¼ÑʼþÊǾ¡¿ÉÄÜ¿ìµØ´ÓÄÚ´æÖвÁ³ý¼ÓÃÜÃÜÔ¿»ò IV µÈÃô¸ÐÊý¾Ý¡£ÓÉÓÚ Java ÊÇÒ»ÖÖ¾ßÓÐ×Ô¶¯ÄÚ´æ¹ÜÀíµÄÓïÑÔ£¬Òò´ËÎÒÃÇÎÞ·¨±£Ö¤ÒÔÏÂÄÚÈÝÄܹ»Ô¤ÆÚ¹¤×÷£¬µ«ÔÚ´ó¶àÊýÇé¿öÏÂÓ¦¸ÃÈç´Ë£º

Arrays.fill(key,(byte) 0); //overwrite the content of key with zeros

×¢Òâ²»Òª¸²¸ÇÈÔÔÚÆäËûµØ·½Ê¹ÓõÄÊý¾Ý¡£

ÏÖÔÚµ½½âÃܲ¿·Ö£¬ËüµÄ¹¤×÷Ô­ÀíÀàËÆ¼ÓÃÜ£¬Ê×ÏȽ⹹ÏûÏ¢£º

ByteBuffer byteBuffer = ByteBuffer.wrap(cipherMessage);
int ivLength = byteBuffer.getInt();
if(ivLength < 12 || ivLength >= 16) { // check input parameter
throw new IllegalArgumentException("invalid iv length");
}
byte[] iv = new byte[ivLength];
byteBuffer.get(iv);
byte[] cipherText = new byte[byteBuffer.remaining()];
byteBuffer.get(cipherText);

СÐÄÑéÖ¤ÊäÈë²ÎÊý£¬±ÈÈç IV ³¤¶È£¬ÒòΪ¹¥»÷Õß¿ÉÄܻὫ³¤¶ÈÖµ¸ü¸ÄΪÈç 231£¬Ëü»á·ÖÅä 2 GiBÄÚ´æ²¢¿ÉÄܺܿìÌîÂúÄãµÄ¶Ñ£¬Ê¹µÃ¾Ü¾ø·þÎñ¹¥»÷±äµÃ΢²»×ãµÀ¡£

³õʼ»¯ÃÜÂë²¢Ìí¼Ó¿ÉÑ¡µÄ¹ØÁªÊý¾Ý²¢½âÃÜ£º

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, iv));
if (associatedData != null) {
cipher.updateAAD(associatedData);
}
byte[] plainText= cipher.doFinal(cipherText);

ÒÔÉϱãÊÇËùÓÐÄÚÈÝ£¬Èç¹ûÄãÏë²é¿´Ò»¸öÍêÕûµÄÀý×Ó£¬Çë²é¿´ÎÒÍйܵ½ Github ÖеÄÒ»¸öʹÓà AES-GCM µÄÏîÄ¿ Armadillo¡£

×ܽá

ÎÒÃÇÐèÒªÈý¸öÊôÐÔÀ´±£»¤ÎÒÃǵÄÊý¾Ý£º

±£ÃÜÐÔ£º·ÀÖ¹ÇÔÌýÕß·¢ÏÖÃ÷ÎÄÏûÏ¢»òÓйØÃ÷ÎÄÏûÏ¢µÄÐÅÏ¢µÄÄÜÁ¦¡£

ÍêÕûÐÔ£º·ÀÖ¹¹¥»÷ÕßÔںϷ¨Óû§Î´×¢ÒâµÄÇé¿öÏÂÐÞ¸ÄÏûÏ¢µÄÄÜÁ¦¡£

ÕæÊµÐÔ£ºÖ¤Ã÷ÏûÏ¢ÊÇÓÉÌØ¶¨·½Éú³É²¢·ÀֹαÔìÐÂÏûÏ¢µÄÄÜÁ¦¡£ Õâͨ³£Í¨¹ýÏûÏ¢ÑéÖ¤´úÂ루MAC£©Ìṩ¡£×¢Òâ£¬ÕæÊµÐÔÒ²Òâζ×ÅÍêÕûÐÔ¡£

¾ßÓÐ Galois/Counter£¨GCM£©¿éģʽµÄ AES ÌṩËùÓÐÕâЩÊôÐÔ£¬²¢ÇÒÏ൱ÈÝÒ×ʹÓ㬲¢ÇÒÔÚ´ó¶àÊý Java/Android»·¾³Öж¼¿ÉÓᣠÇ뿼ÂÇÒÔÏÂÊÂÏ

1.ʹÓÃÓÀÔ¶²»»áÓëÏàͬÃÜÔ¿Ò»ÆðʹÓÃµÄ 12 ×Ö½Ú³õʼ»¯ÏòÁ¿£¨Ê¹ÓÃÏñ SecureRandom ÕâÑùµÄÇ¿Î±Ëæ»úÊýÉú³ÉÆ÷£©¡£

2.ʹÓà 128 λÉí·ÝÑéÖ¤±ê¼Ç³¤¶È¡£

3.ʹÓà 128 λÃÜÔ¿³¤¶È£¨Äã»áûÊµģ¡£©¡£

4.½«ËùÓÐÄÚÈÝÕûºÏµ½Ò»ÌõÏûÏ¢ÖС£

 

   
1662 ´Îä¯ÀÀ       31
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶