[NCTF2019]Sore
附件:
ciphertext.txt:
nsfAIHFrMuLynuCApeEstxJOzniQuyBVfAChDEznppfAiEIDcyNFBsCjsLvGlDtqztuaHvHbCmuyGNsIMhGlDtbotCoDzDjhyBzHGfHGfoHsuhlssIMvwlixBHHGfDRjoCKrapNIwqNyuxIBACQhtMwCmMCfEBpsrzEuiLGBoMipTkxrznoHfAkqwzvxuzCzDbLyApCGvjpqxkuwpgsLrqsVfCRwzlFmtlyrhuyEiivruFRpCRjkEDrqEqthyGwgsLnQvHmtzwDEznopBpsDOxvgBGIKzurFQxwQxkptutxzmfeLFQoRpJRvrpHxilwqeqMeiiIGBsQpCCvrptAlHsDnuRltmHuCGFpsBcwnsEblsswEPwerNpIADpJRCvwQxrntJltNpfAuFBwRstytoyvcepwtwqNlmmNGFsJjsQvkyvrkrstxJOzniQvNvzdDUdyJzjqzsErqxEjguyFMNwtPjsDwjoDfCdxzvftNGyzKjCEjsDxjqsjGMqFpimGpIADpJRFkovHJlpthyHnpqyBOHhmDMmoosClwiehEzmffOGMvDxDSnnyLuXFlwYEPvosQxCrRxwCpDswHopxDruvEzsOgBsXxDLvvlMpezwpnOOsjrANzHDsLCnoqLCepgtaHNHfpysNHGfOMqkyvlozxHetJGfvNuCGKjIRnoDLAbpyxnJCpqeLxuBCuwCpGpOnkEywrEPrisHrItSiDQgvtLCipyJnDzwtxBnNoKxpWuCxwuiqwDmIJxffIqSGSbzGpqlDnXvNIwqNzoxBrQoXuDRjonsAozzHeBjweTBBypDtIGnvHGDiosItqGvusGrIFzoNRjsyykrExweMvDtsLGItVbAIkxrFnuEyDmuIzxMNBIyziDJfyqLqbmjAtqOEiivnwyNgwCtmzsCgFxIfEMEiiBrFzNgxRdEEKqbHtJltIEmiNzygGfHyknVwnmJtJrxvyewNBSCTsHCnptxHlFiDnJHtohmuyKztHRkvwKxopfImuWFurIGuGRpGCcCDzntlxqevJCfEHLQoXxtIgzEynqEnCgsGztiLnHrBmDQgBEGCephprHJFtiFnHrXpJAqEwvBqlwItECpbvNuuHMvIRAwFKrZtyplMvJttFnSGhuLyuzwsHfyldhcvCjicGJzzztBvrlLBXxjHoDBlcsOGzwEuNWgkCKjdzBweDdHbwuyCHSmtIknezjqDtCeDDnfxBvHuzcDSvmlJAlFxtlIOsfCuyQoXtEJcIEznplrtsEIrtMNuIIFiIRjonsAozzHeBRltgFBMsCjCRjoHAwqpwIiCzzmhjuIsAfHyknTLFXDywevDCtxNvGsRitNtknLrZlqAyIvteeHLNvHovqjoAJxYlgAyvJChsNFBsVbHQwzAGBboyDbuNzsiuGGslbNzglpujrDjxtIvCpyHqWvQjHRokDaBXtihhuyterNFuMzoNRjsyyFepsXsqDouluGmvDqGMdkmDHoprtmrzCfhMuyKztHSrzzKnaEtqeIJCfeNzyRNzDSykyLClrtuoHvCjhyBHwSJHyknTCwbHxweFMzcevySrHelFgxDzntlxptyIJmmNGFsJjsypnLDufpfCdTWlohcHMsCuDEqDzLqbAfGkMDEilyEMvDxpQokosklFyIhuxlsvIHMsKZDSeyFDmkElttxzCpjzGBsFpsBcwEzrkrNBtEJmjkMuyGzjsgvrzMpeExweMvDoxABCBFuDypCHwAjpgJtICpemxaIMNvGCpyEYxlyNAlMvtujIESofpDLKClAmTpBtruMthlNGBsQfIFgxeznopBtruvqfAEvxGQjsGpqzFrqxtHtBTGfvSyCHSmtIknDswalktwFvCfrNFQsQfLykDtFpXCtJntJFuwCqyGHuIGpqzFCepgtnsCpteHquzKXwyvSoAmtlxXwuIEvtNBNvDxxLfyHOqbCjIhuTDfpFGBsSjrIgDDswamtJgxOzmhjuIsAfpRkmvwCQsjCIwvGfmNGIvDshFgGlKBqlssiDBCjkBGHsWuIMooSwAbTxpitrljxuFyqNosRcupLqbCjHtEAJpyLqIIFiIMqSDLjoEjsgyQtokBrLHGfGCuDzxCepiDuwCDiixyyBSntwqEvwnmtyZeuKtujIEGsRitQcsolqbyxweIvtevCtBHzgICtGlJmMwjpsuosbxMqyDQfHQkxrOqbyxDmuwzeCMnSGOmtyuoEGHlFNBeqItgmNFjvNfqCqBDGvbmtsyjCluhyCLsRttBvrpzniwtJtEAxfFOGcDTuIFgnzMpemfrkyIxztIpEsSBGCpDJGDdzsCaHDofxIBMvDbHIgnxwbepBpsBJzlmHtuHLfHMtDzxorysNYEPnpyFqNsKmHFgGlKwqEtDsEMpbxGruBXnDPgWlQkbTBxlBOsfryKNHHntgnvHsCZsDpIIvteKIGSCTsIGeupLhbDLDaxzlexBrHWKmqCqxEzrpmjCcxMthlNBPsQitPgSwDFXEhwyqdHfrNBPsQbCBukEvxtytCtxDDciHpBoMeHFgGpFCXyivoJJyulypuFQpJQgvdzntlqzetvwmeLBOBCjIgoolFBepBplAzoprwruzKuwCykJsAlFssiJosfrMuyGzusMyxzFCetxqiwwCpAHoyoSvEJqyvAwdzqshEMDfXBrHHGfrytBzMBbwxIaHOpeeHqcKzurFgnswAdzfGoKIobrxnLCTosrjoCwFbCjDnBTlcsOGzwUfDPusIGCepwzitNzoxBrLwCfpLfDswBlylIhuxlsvIHMsKxpQrvlQrkrBpsiHzliarNGHonMwBPQnpTyLaIKwbCCAAwSwtPAtlRIvlssfKIyzEFyNvDlxBuupHCqCDxnwOzhvuozCQuwCiywvAfylpntNzxeMBFroiDCdolFmFHfHsEMEpjusLoHeHFgnqsuizkutxzrphxnGvNsHCdEEamfosIsqTloCNuCBFpGBqkyQCetsvTxzEimHtQwSizGfCtKrcEmtyMvyuxItLoAuwCiywvAfylNoKClwiNBFsSuwConzACXyiCoJNlzeHLNvHovghDswHclqAovAEiiSsuzKpuDdEEACpmfsivTzvwuLuBXuwGpqEGCeprlhuIEiiLvxsVbHMxoCKqbrtIovAsfvBBLGDbCBekxwxspwIoCzjpyLvxsNorCvyzLqfDyxmuNsfwuvxbNJAJlEDLFXEhwyqdEimHxczKkJQvGlLleTxpitdrbzyuyFRpBCoyCwxcsjGdEPriLyEyUDuHMooxGAbEnrkuODTlyGICJuwCfyFyqlqkBeYHypxGnxoSzDScxJExopxweIvteMEAIKgvGPAEALqbEmxnwNrprHnMHzsIyiktFcepsplBJqbwOqxsMtwCikGwvblpxsIosfrMuyvDmsFgBsswazzIaDyDbmxVNGQbxLkxraCpDyprJDyhxIEuwMJzLqGeznkHmptICpemxvNrznCLgkCCriwjsmuNsfvynwvDexLoInGjqAtrkuOlohNBIyNvIKABpvqryyxnwClueHqJISjIMpwJznXoIDnJTzvAuANwSJHyknjGDZlsLeqMtueQuCzDPzyARFJAvFuIhEPrirIJsCTstEqxysvfDxNoKMCjhylIIVpCRioEQxrCtLnxJCtiIEuBXuwGpqdznhpuIhqIrjrAnLCTosRjyFyqAtiNoKHpbrCGQvzuNMwClAmVzzGeqGwzeLrHHFpxLikHsHXyDLhuMpBvyLIIQfpJnIrGrkrmDmuvquiLJuFCtHFgkDCnaxjneqCTteCqcADbCRkDEGxFHfHnJGJjrAGIvDsXPgkwDHativoxJxfezGyFVbGBuRFJAvFuCoMdDbmxgBsSixLiCDLjoEnCgiCpseHnHrApJEjDswAqthzeJvyekIGvoBlDLvrpyxaofBcqMCpyMrFxTtIGpDtEnQsjCsxzHbpErxoKmIFgGlQjozzCdyOEjpFFBsFpIFgBzOwezwHervnlXBrHGGfvMvyyACPsjLaLzousGruBCJLyxootjZvGDyyOmfkuANCQbxLnsvwjYlxIaHyTofOpEsStXQyolJClRtsABGEiiJnLsMuHypnxGCepwHaDypwiLLvCCzLCpDzNnolsssJJzevCtBHTosCtDswAlzkDfJCpdeLEIIRfAQqDswHtzzAdDOrfxMBuyDeIMvrpKtfytGaDTEimHtvISJHRwmvsAlFssoDOsffyAwvEpGOwsEwjtsnAeYBzutLrNHXtDymsyyFbEjHpuxtbpFLGMMfrIcxoEHmlsIscTsvrNvHuGbIPgkwDHdlAtmuLFjxynFCSpuNtyEwlqttCiDvHbCvHNWFpIQqkvwmXyDLaOdojhHGwoQfIFqErzRcpqIsEylnrBnJDXbAJqpDMmapsIhuRlzsFqjvNfqCmoALpltsvaHJFohuAxoQpJLfSHsBalrCnuvCceQyCBFJuCnDDGmXxswaFKJjjSBOKzoIRquyGFqsjIrKOsJhIANyMpLUjITLFXDoJsJOsbxMuyzNpzCfCzvjjysxcuOsfAuLMvDltNvqzAwdlwDuDylohuEIIMexLjoCturphDaJvyeeFyaCCJLGurJGDZzzAdLzmfiHGBsQfiFcDDsuiTrvoyIrusNrFzzcDSvSnGDiouGorvmmCNrFzXpJUjkEamfofutuMTxiHGBCLfpLfrzORdzyHisFlohuyFoMeLFcDDuqlzqXmIPAqsMrxHNhDRqxpPCclqAavOpsMArNCTuDDjoCwkrENsoDOqfiFyCyDjIgtolDuvotCtjCluwNHztCptQpDtFCbCjHtCzEpsGHwvQjvFvxzOJizyDfFzzqpyrMDDdxynvJLqfDtCeFNJdlInHoKzHRiEJLqbJmpvuCpsiEryDRbHIkxrEnfqNBgEDyheJCFMLzHCnpHznkTlDbqxvusMpBCNmCCzDdwyqprqeHdEtwOpBoRuJNknBMnpEnDnyIxzsJvHwNoXKgkyzxtotNoKFypAQuuHXpJPgqzAwdEtsoJDwmCIHxCHuiFgkyKFbCnHyEPoprNVNvHozgcwmMCezBsoYFypAcFQszsxRukDLDmtiFuuNEjsHQVwRoIyullvjpEmtruNEpjNuyAAvIFgupwyplxziDBxfeFBNCErJCuDtGwpEtDHuyCpzyBPsQmpQvclLDoofNwyOsulCFYBFmxQjlltnqsfIsyIEimMAyKOjrRwBpznpHwxtyIrTlyJuGOstRvIlxobnytdrPEwiLLACNeAMqutFpxyDLaOJyfxCzyKGfCQjoHwwqEtIhuGlemyFLCNnLyADswqbwqsoMItoxBrIHGfGUkxrVKXDptdCzHieNVNvNvvFvkmGDqlqAtxDDtxOszWIvHRhsyABepiIeBGtokSBOoApJRKntvwqvsDwMCluxBrBsKmIMukJaovzzLaDOEpoHBQHGfIPwDsamlyyznERHieNVNvHozydyFLrqTrHoHMJJxIyxGNnpLAzpGyipfqoKOtuEvBOHzmAgmxzOrpTxDrJJqnmMFyJDsNzqnJaClwipbEPEFzyAIzCTIPcnwsCbCfCdQxvmiSsIFHoHRcxnwRqsnCkYzGfrGvMGSipRiyovjjXfJryxpJxMsOBMzSMpDpNnoEjAlqIJcsxLuBXuwGpqTxHlFiDyEPDueLGGwRtxLioGwAvmtsy
维吉尼亚解密网站:
sheWOULdNtWalkRIghTnexTTomeWheNWeLEfTTheseaLiONSbuTSHeDidNtWaLktoofaRaWaYsheSOrTOfWaLkedoNoNeSideOfTHeSIdeWalkandIWalkedONTHeOTheRSideITwaSnttOOGORgeOuSbUTiTWasbeTteRTHaNhaVingherWaLkaboutamIlEaWaYfROmmelikebefoReweWeNTupaNdwatchedThebeaRSoNThaTLitTlehiLlfoRaWhIlebuTThereWasNTmucHTOWatcHOnlYoneofthebeaRSWaSoUTthePolarbeaRtheOTHeRoNEthebRoWnOneWasiNhISGodDamcaVeandwOUldnTcOMEoUTAllYoucoUldSeeWaSHiSrearendtherewaSaliTTLeKidStandingnexTTomeWiThacOWboYhatonPracTicalLYOveRhiSearSaNdhekepTTelLiNGhiSfatheRMaKehiMcOMEoUTDaddYMakehiMcomeOUTilOOkedaToldphOebebUTShEwOUldnTlAUghYOUknoWkIdSwhEnTheYresOreaTyoUtHeYwONtlaUghoranYThinGAfTErWElefTThebeaRSWelefTTHeZOoandcrosSedOVerThISLiTTleSTReetinTHepaRkaNDthEnWeWenTthrOUghoNeOfThOSeliTTletUnNelstHaTaLwaYsSmellfrOmSOmebOdYSTakIngaLeAkITwaSontHeWaYtOThecaRrouSeLoldPHOebEsTIllWOUldnTtaLktoMeORanYThingbuTsheWaSsoRTOfWaLKingNexTtOmeNowITOOkahOLdofThebeLtaTThebackOfhErcoaTjUsTfORTheHeLlOfiTbUTSheWoUldNTleTmesHeSaidKeepYoUrhandsTOYOUrSElfifYoUdOnTMindsheWasSTillSoreaTmeBUtnOTaSSoREaSShewasbefOReANYWaYweKepTgetTiNgcLoseRaNdClOSeRTOThecarROUseLaNdYoUCoUldStarTtOHearThaTNuTTYmUSiCitalWaYspLaYSitWasplaYingohmaRieiTPlayeDthaTSAmeSoNGaboUTfiFtYYeaRSagoWheNiWasalITTleKidthatSoNeNIcetHiNgabOUtcaRRoUselSTheYalWaYsPLaYThesamesONgsIThOUGhTThecaRrouSeLWascLOSeDiNTheWInterTiMeoldphOeBeSaidITWASthefIRstTiMeShePracTiCalLySaidaNYThIngshePRoBabLyfORgoTSHeWaSSupPOSedtObeSoreaTMemaYbebecauSeitSaRouNdChRiSTmaSiSAidshedidnTSaYanYThingWhenIsaIdthaTshEpRObabLYremembeRedSheWasSUppoSedTobeSOReaTmeDOyOUwanTTogofoRaRideONiTISaidIKneWshePRobablYdIdwHenShewasatiNYliTTLeKidandALlieaNdDBandiUSeDtOGoToThePaRkWIThheRShEwaSmadaboUtThecarrOUSeLYOUcoULdnTgetheRoffTHeGodDamThingIMtOObigSheSaidithoUghTsheWaSntGOINGtOanSWeRmebUtSHedidnOYOuREnoTGoonILlWaitfORYagoONISaIdWeWereRighTTHeReTHenthereWereafeWKidSRidIngoNitmoStLYVerYlITTleKidSandafewPaRenTSWeReWaiTiNgARoUndOUtsIdeSItTIngoNThebencHesaNdalLWhatIdIdwasIweNTupTOThEwiNdoWWheReTheYSelLTHeTicKeTSandboUghToldphOeBeaTickeTTheNIgaVeiTTOhErsHeWaSStandiNGRigHTNeXtTOmeHeReIsaidwaitaSecOndTakeTheReStOFYouRdOUGhTOoISTarTedgiVingHeRTHeREsTofThedOugHShedleNTmeyoUkeepitKeePitfORMeSheSaidthensheSaidrIgHTafTErWaRdPleasethatSdePReSSingWhensOmebodYSaYSPleaseTOYoUIMeaNifiTSphOebEoRSOmebodytHatdePReSseDthehelloUtOFmeBUTiPUtTHedoUghbackiNmypOcKeTAREnTYOUgonNaRIdetOOShEaSKedmesheWasLOokiNgaTMeSOrToffunnYYOUcouLdTeLlSHeWaSntToOsOReatMeaNYmOReMaYbeIWilLTheneXTTImeillWaTChYaISaidGOTYOUrTIckeTyeSGOaheadtHeNILlbEonThisbeNchRighTOVeRheReIlLWATchyaiWenTOVeRaNDsaTdownoNthISbeNcHaNdSHeWeNTAndgoTOnthecaRRoUSelshewalkedallaROUNDiTimeaNSheWalKedoncealLthEwaYaRoUndiTthenSheSatdOwnoNThisbigbRoWNbeaTuPLookIngoldhORSeTHeNTHecarRoUSelsTaRTedaNdiWatcHedheRgoaRoUNdandaROUndtheReWeReOnLYaboUTfiVeORsiXOTherkidSontHeRiDeaNdTheSongThecarrOUSeLwaSplaYingWassMokegeTSInyOuREYesItWaSPlaYINGiTveRYjaZZyandfUNnyALlThEkiDskePTtRYingTograbfORthEgoldRingandSowaSOLdphOEbeaNdIWaSsORTofafRaIdSHedfalloffthegoddaMhOrSEbUTididnTsaYanYThINGoRDoanYThingTheThiNgWiThkIdSiSifTheyWanttOgRaBthEgoldRingYoUHaveTOLeTthEmdoITAndNoTSayaNYThIngifTheYfalLofFTheYfalLofFbUTITsbadifYousaYaNYthIngTOThemwheNTheRideWaSOveRShegoTofFherHORSEaNDcameoverToMeyouRideOncEtooThiStimeShesaidnOILLjUSTWATchyaiThiNkilLjUStWaTchIsaidigaveheRSoMEmoReofheRdOUghHeReGEtSOmemOReTickeTSSheTOOKthEdoUghoffMeIMnotMadaTyOUanYMoresheSaidIKNOWhuRRYUPTheThingSgonNaSTarTagaiNthenalLOfasUddeNshEgaVemeakisSthenShehEldHeRhandouTaNdSaidITSRaiNingiTsStarTIngtORaiNIkNoWthenWhatSHedidiTdamNNeaRKilledmeShereachEdiNmYcOatPockeTandTOOkOuTMYRedhuntingHataNdPUTiTOnmYheAdDOnTYouWaNTiTISaidyOUCanWeaRitaWhIlEOkaYHURRyUpThOUghnOWyOUreGonnamiSsYoURRideyOUWoNTgeTYouRoWnhORseORaNYthIngshekepThaNginGaROUndThoUghDidYoUMeanITWhatYOuSaIdYouReaLlyaReNTGoiNgaWaYAnYWheReAreYOUReaLlYgOinghOmeafteRWaRDsSHeaSKedmeyeaHIsaIdiMEaNTiTTOoIWaSnTLYinGTOhErIRealLYdidgohOmeafTeRWaRDsHURRyUpNoWiSaidtHeThiNgSSTarTiNgsHeraNaNdBoUGhTheRtickeTandgOTbaCkONthegoddaMcaRRouSeLjUsTInTiMeTheNsheWalKedaLlTHeWaYarouNdiTTilLSHeGoTHeRoWnhorSebackTHeNSHegOtonITSheWaVedtoMeaNDIWavedbaCkBOyiTbegaNTORaiNlikeaBasTaRdInbUcKeTsISweaRToGodALLThePaReNtSandmOTherSaNdeveRYbODyWEnToVerandsTOodrIgHTUndErTheRoofOfTHecaRROUSeLSoTheYwouLdNTgetSOakEdTOtheSkinoRaNYThiNgbUTISTuckaRoUndoNThebeNchFoRQuiTeawhiLeIGotpReTTYsOakingWeTeSpecialLYMYNecKandMYpanTsmYhunTiNgHaTRealLYgaVemeQUiteaLOTofProTectioNiNaWaYbUTIGoTSoakedAnYWaYididNTcaReTHoUghIfelTsOdamnHaPPYaLLofSUddenTheWayoLdphOebEkePTgoingaROUndaNdaRoUNdIWaSdamNneaRbaWlINGIfElTSOdAmnhaPPYifYOUWanTToknOWtheTrUThIdONTkNoWWhYITWASjUsTThatShelOokEdSodamnniceTheWaYShEkePtgoIngarOuNdandaROUNdiNheRbluecOaTandaLlgODIWIshYOUCouLdVebeeNTHeRetHaTSallImgoiNgtoTeLlabOUtIcOUldpRobablYTeLlYoUWhaTididafteRIweNTHOMeaNdhoWIgotSicKandalLaNdWHaTSchoolImSUPpoSedTOgOToneXTfalLafTerIGeTOUtOFheRebuTIdoNTfeeLlIkEiTireaLlydoNttHatsTUffDoeSnTiNTeReStMeTooMUchRigHtnoWAlotOfPeopleeSPEciallYThiSoNePSYchOaNaLySTgUYTheYhaveHereKeePSaSKingMeifIMgOIngaPPLYMySElfWhenIgObacktoScHOOlNExTseptembeRiTssUcHaStUPidQUesTiOniNmyoPiNiOnIMeanhowdoYoUKnoWWhaTYoURegoIngTodoTIllYOUdOIttHeanSWeRiSyOUdonTIThInkiambUThoWdoIKnoWiSWeariTsaSTUpidQueSTioNDBiSnTasbadasThereSTofTheMBuTHekeepsaskiNGmeaLOTOFqUEsTiOnsToOHedRoveOVeRlaStsaTUrdaYwiThthISENGliShbabethaTsiNThiSNeWPicTuRehesWritiNgSheWaSPreTtYaffectedbUTveRYGOOdLOokiNganYWaYOnetImeWHeNSheWentToTheLadieSROOmWaYThehelldoWNintHeOTHeRWingDBASkedMeWhaTIThOugHtabOUtalLthISstUffIJuSTfinIShedTeLLingYOUaBoUTIdidntknOwWHattHeHeLlTOsaYifyouWaNTTokNOWTHeTRuThidontknOWWhaTIThInkaboUTitImSoRRYItOldSOmaNYpeOpleaboUTitAbOUTalLiknoWisIsOrTOfmiSSeVErYbodYiToldabOUTEveNOlDSTRadlaTeRaNdAckleYfORInSTanceIthiNkIeVenMiSSThaTgoddamMaUriceItSfUNNyDOnTeVerTeLlaNYbodYaNYthIngIfYoUdOyOUStaRTMiSsiNgeVeRybody
解密得:
flag:
vlbeunuozbpycklsjxlfpaq
task.py:
from string import ascii_letters
from flag import flagctoi = lambda x: ascii_letters.index(x)
itoc = lambda x: ascii_letters[x]key = flag.strip('NCTF{}')
len_key = len(key)plaintext = open('plaintext.txt', 'r').read()plain = ''.join(p for p in plaintext if p in ascii_letters)
cipher = ''.join( itoc( ( ctoi(p) + ctoi( key[i % len_key] ) ) % 52 ) for i,p in enumerate(plain) )open('ciphertext.txt', 'w').write(cipher)
通过加密脚本可以看到这道题的重点是key
在没有key的情况下要破解密文要经过3个阶段(通过概率分析明文)
- Kasiski 实验
- 重合指数攻击
- 字母频率分析
参考链接
Kasiski实验通过查找相同的子串(3个字符以上)来猜测可能的key的长度.
比如两个相同的子串的距离相差8位,那么key的长度应该为8的因子,这样当我们有足够多的数据时就可以基本确定key的长度了.
重合指数攻击
重合指数CI
L 是指长度,f是指相应字符出现的次数.
一般来说,一段有意义的文字的CI是基本确定的,英文中CI 约为0.065.这样可以通过分组计算CI再取平均值与0.065比较进一步确定key长度.
一旦密钥长度确定以后.
通过密钥长度进行分组,如len(key)=8,则可以分成8组,每一组对应的密钥字母是一样的,这样我们就可以通过字母遍历来算出最符合字母频率的情况,这样单个密钥字母就基本确定下来了.
// Friedman测试法确定密钥长度public int Friedman(String ciphertext) {int keyLength = 1; // 猜测密钥长度double[] Ic; // 重合指数double avgIc; // 平均重合指数ArrayList<String> cipherGroup; // 密文分组while (true) {Ic = new double[keyLength];cipherGroup = new ArrayList<>();avgIc = 0;// 1 先根据密钥长度分组for (int i = 0; i < keyLength; ++i) {StringBuilder tempGroup = new StringBuilder();for (int j = 0; i + j * keyLength < ciphertext.length(); ++j) {tempGroup.append(ciphertext.charAt(i + j * keyLength));}cipherGroup.add(tempGroup.toString());}// 2 再计算每一组的重合指数for (int i = 0; i < keyLength; ++i) {String subCipher = cipherGroup.get(i); // 子串HashMap<Character, Integer> occurrenceNumber = new HashMap<>(); // 字母及其出现的次数// 2.1 初始化字母及其次数键值对for (int h = 0; h < 26; ++h) {occurrenceNumber.put((char) (h + 65), 0);}// 2.2 统计每个字母出现的次数for (int j = 0; j < subCipher.length(); ++j) {occurrenceNumber.put(subCipher.charAt(j), occurrenceNumber.get(subCipher.charAt(j)) + 1);}// 2.3 计算重合指数double denominator = Math.pow((double) subCipher.length(), 2);for (int k = 0; k < 26; ++k) {double o = (double) occurrenceNumber.get((char) (k + 65));Ic[i] += o * (o - 1);}Ic[i] /= denominator;}// 3 判断退出条件,重合指数的平均值是否大于0.065for (int i = 0; i < keyLength; ++i) {avgIc += Ic[i];}avgIc /= (double) keyLength;if (avgIc >= 0.06) {break;} else {keyLength++;}} // while--end// 打印密钥长度,分组,重合指数,平均重合指数System.out.println("密钥长度为:" + String.valueOf(keyLength));System.out.println("\n密文分组及其重合指数为:");for (int i = 0; i < keyLength; ++i) {System.out.println(cipherGroup.get(i) + " 重合指数: " + Ic[i]);}System.out.println("\n平均重合指数为: " + String.valueOf(avgIc));return keyLength;}// Friedman--end
解密脚本:
from string import ascii_letters
ciper='nsfAIHFrMuLynuCApeEstxJ'
plain='Shewouldntwalkrightnext'
x=zip(plain,ciper)
flag=''
for i,j in x:if ascii_letters.index(i)<ascii_letters.index(j):flag+=ascii_letters[ascii_letters.index(j)-ascii_letters.index(i)]elif ascii_letters.index(i)>ascii_letters.index(j):flag+=ascii_letters[52-ascii_letters.index(i)+ascii_letters.index(j)]elif ascii_letters.index(i)==ascii_letters.index(j):flag+=ascii_letters[0]
print(flag)
运行得:
vlbeunuozbpycklsjXlfpaq
大佬的wp