±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÍøÂ磬
±¾ÎÄÖÐΪ´ó¼Ò½éÉܸ߼¶¼ÓÃܱê×¼£¨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.½«ËùÓÐÄÚÈÝÕûºÏµ½Ò»ÌõÏûÏ¢ÖС£
|