Подскажите по шифру Виженера...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by z0mbyak, 29 Dec 2010.

  1. z0mbyak

    z0mbyak Active Member

    Joined:
    10 Apr 2010
    Messages:
    537
    Likes Received:
    200
    Reputations:
    293
    Доброго времени суток, уважаемые форумчане.

    Вы не могли бы помочь мне с алгоритмом шифра Виженера?

    Дело в том, что я никак не могу реализовать метод шифровки дешифровки, точнее я не могу понять как составить таблицу соответствия алфавита, а потом привинтить сдвиг по ключу...

    Мозг уже кипит, если можно, подскажите пример реализации на VB или VB.NET.

    Или просто структуру циклов и условий:)

    Заранее благодарю.
     
  2. RDL_Rider

    RDL_Rider New Member

    Joined:
    21 Jun 2009
    Messages:
    100
    Likes Received:
    3
    Reputations:
    0
    Виженер это легко! Смотри, вот у нас есть блок данных:
    допустим, наш ключ - слово "mouse". Значит, правила подстановки будут задаваться пятью таблицами, которую объединим в одну:
    Code:
    abcdefghijklmnopqrstuvwxyz
    mnopqrstuvwxyzabcdefghijkl
    opqrstuvwxyzabcdefghijklmn
    uvwxyzabcdefghijklmnopqrst
    stuvwxyzabcdefghijklmnopqr
    efghijklmnopqrstuvwxyzabcd
    
    Теперь для примера, зашифруем фразу "CRYPTOGRAPHY AND DATA SECURITY".
    Запишем символы ключевого текста под символами исходного. Так как ключ периодический, будем повторять пока не закроем весь исходный текст:
    Code:
    CRYPTOGRAPHY AND DATA SECURITY
    MOUSEMOUSEMOUSEMOUSEMOUSE
    
    Каждый из символов ключа указывает, которую из таблиц подстановки
    нам необходимо использовать для подстановки рассматриваемого символа ис-
    ходного текста. Символ ключа «M» указывает, что соответствующий символ
    шифротекста необходимо выбирать из таблицы подстановки, алфавит шифро-
    текста в которой сдвинут относительно алфавита исходного текста на
    Pos(«M») – Pos(«A») = 12 позиций. Таким образом, первому символу исходно-
    го текста будет соответствовать символ шифротекста «C»
    В итоге получим:
    Code:
    OFSHXAULSTTM SRP XSXM MWGGFCLC
    
    Попросту говоря для ASCII-алфавита шифрование сводится к суммированию ординалов символа исходного текста, и очередного символа ключа по модулю 255, а дешифрование - к вычитанию по этому же модулю.
    Терь код. Процедура шифрования блока данных:
    Code:
    keyword - ключ, неограниченной длины
    tmp - данные, опять-таки неограниченной длины
    j := 1;
    for i := 1 to length(tmp) do
      begin
      tmp[i] := Char((Ord(tmp[i])+Ord(keyword[j])) mod 255);
      Inc(j);
      if j > Length(keyword) then
        j := 1;
      end;
    
    Дешифрование:
    Code:
    keyword - ключ, неограниченной длины
    tmp - данные, опять-таки неограниченной длины
    j := 1;
    for i := 1 to length(tmp) do
      begin
      tmp[i] := Char((Ord(tmp[i])-Ord(keyword[j])) mod 255);
      Inc(j);
      if j > Length(keyword) then
        j := 1;
      end;
    
    Вот собсно и всё. Будут какие вопросы - задавай.
    (с) RDL_Rider
     
    1 person likes this.
  3. WaaaaagH

    WaaaaagH New Member

    Joined:
    20 Feb 2012
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    шифр Виженера

    День добрый! нужна помощь в написании алгоритма дешифровки шифра Виженера.
    Проблема в том что известна только длина ключа равная 5, но не сам ключ и соответственно нужен пример кода как реализовать поиск этого ключа в тексте.
    Заранее благодарен
     
  4. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    Если текст большой, могу попробовать. Если что в лс.
     
  5. WaaaaagH

    WaaaaagH New Member

    Joined:
    20 Feb 2012
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    нужен прогер

    и все же нужен прогер способный реализовать поиск ключа в этом шифротексте : нлсгинфулйкцслрюыдуб фйввечаферчбрарежвппфовщлпаеррэжзазяппфкюрстщнтхгщобопкьпбгцсолжкоажжьшбрйулрисныкврргбхощханоупйврщюгбырщосккябмощьйфйкцпхпьм вощюйобкщбкглщйиаыымлдьмхл ксжвбняпупчлвюмкфпжбшщжфаюэжхжчфквбмнбхашмтхпйяжоэкшпрбэяьу коаеяьввцсосаггюысвншызитюобвурымсдугжфлубафпвфоиоухаеазяпмахщйжжкрбиуэкасруюбрйрлщлхьмарбтоброщппвбняпупчлбежкшбуййлгвщуасиахмззпфлвцлнсафпщягиуэягцжюлтопныазфаыгрпоыафппссйбшф вольслнрэадфхожвбкюмсгщлвсдкяпжеллмавщшфвпюцсюущшфвурцтхфкюпсунсуфун жхаюслфукрфшпнщпжпкюпзжьтбрййллупчсахпоыахсряжпйфлгвтныжмахщйжжкэбкгучалерйапощппгм мглушыдсагфхубкогиейллебпэбхояйахбмчйщфкюпфущкгьфилйкалчхггуябвтпойрфюыдсашмасеущаьболбохлойхбкюеейш усдщлогапобвщлпбвйкяазаэчжзфиеббаэяфтжшзаеаьмиейюфйвльфрхпоэбчйулте тмогаэлйпжшснвесыггошфаджцчбкпкцпхпьжквгкюгсжфлоивщчэьпфллрйосаьй эафжшзпубкнжомлупвгеджзщрхаеауябойулружпчпййцлйфрщчэкпнмуяапч вншыдсбцабейющпжпкдйчсллмидхыакбыынлолйылкэканмигаггюысволуггмксдсаымссмршатбьымяанжрлтеобиуэкарбплпхльжуюнкяжнтюынввяцггаэяпбылкарбплвцлныквпюцсюущппвурцтхбкыирбвмжхашынискммчбнфугаюлжвощшжуаэясслулгвулнмлчрлигнрщьврщллсущэппфкытцырюуемйсуф кубпжшматсулюхпчлбеущэасучсшгмкгусаьмирьаллссьсттпшржрущоаппсщпвтшмвйбюзаубтчйыоешйврлэпо чфаларюмлаымссмжлпнбтжггмэкацльмеиошжнвущлжжпкшпйощлвюмщлигнрщйхэ

    з.ы. пробел тоже символ и он тоже заменен на что-то.