From d7689a8562d5e77b3728aff6fa723d46102738a5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Fri, 10 Jul 2020 23:35:13 +0530 Subject: [PATCH 01/16] Create .gitignore --- .gitignore | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e502c69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# XCode project +*.xcodeproj From c89022245e480bde6ee3aba5b4de3c51d7f979b1 Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 04:23:14 +0530 Subject: [PATCH 02/16] Working encoder --- .DS_Store | Bin 0 -> 6148 bytes EnigmaMachine/.DS_Store | Bin 0 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 312 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 47207 bytes .../xcschemes/xcschememanagement.plist | 14 + EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 35 ++ EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 21 ++ EnigmaMachine/EnigmaMachine/Rotor.cpp | 68 ++++ EnigmaMachine/EnigmaMachine/Rotor.hpp | 29 ++ EnigmaMachine/EnigmaMachine/RotorSet.cpp | 41 +++ EnigmaMachine/EnigmaMachine/RotorSet.hpp | 26 ++ EnigmaMachine/EnigmaMachine/Utils/config.h | 42 +++ EnigmaMachine/EnigmaMachine/Utils/utils.hpp | 32 ++ EnigmaMachine/EnigmaMachine/main.cpp | 19 ++ 16 files changed, 654 insertions(+) create mode 100644 .DS_Store create mode 100644 EnigmaMachine/.DS_Store create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp create mode 100644 EnigmaMachine/EnigmaMachine/Rotor.cpp create mode 100644 EnigmaMachine/EnigmaMachine/Rotor.hpp create mode 100644 EnigmaMachine/EnigmaMachine/RotorSet.cpp create mode 100644 EnigmaMachine/EnigmaMachine/RotorSet.hpp create mode 100644 EnigmaMachine/EnigmaMachine/Utils/config.h create mode 100644 EnigmaMachine/EnigmaMachine/Utils/utils.hpp create mode 100644 EnigmaMachine/EnigmaMachine/main.cpp diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bca3b186422bad3d581261070390cf1b53faf320 GIT binary patch literal 6148 zcmeHKO-lno41Li(R7B{}+$-p zFvE_6Yi#j=JL&?@?C-ET4!gkWC~VGv?Kkcx`u`Y7r~2`7UCBT)kPIXPKVpDqwq$ha zm~AqU3?u`e3}}BSRAC#~Io7R%O)UY4x<*%_ty)4kC9n-?Ybml-Vb`zhH=29kk)#(*`` z`E*=g5)O)H#ah(hb?cODT9ql96)#?5sn{jPm=crjUUek$r5vYV@lMMU< F1Mi7mD7ydv literal 0 HcmV?d00001 diff --git a/EnigmaMachine/.DS_Store b/EnigmaMachine/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9fa36f4de111691834bb18c625dd593f6456e24e GIT binary patch literal 6148 zcmeHK!Ab)`41Lia3L^BT$N2)Gf3TGH=*9kkx?9@Hw!0{T$N5ix#+PI&71x6ZB9g%5 zWiy%V&MTcv0LbjQnF134V-7`8V?fkBICWBjPl;kVcDTbeM~%%uqQB_UZ$HNZdu*}B z@%L}(TQyI0d*5{}w}*?b!*GQcZn{H*6?#0$1-}URw_cQdHqYR=yQAjWl z3~Fs>GxYVpT9Z z(nAqnO7x{tS`6{!^rsS670iyl98#JODQ`YBFNbTgBnyXBj-i8rVBjMI+WS%_TK^aP zOAa>q77{8L2nPNu12UQ~=QHlE)Yeb?)LNT3ZaGvmE~`PIZKarKrI-(Tj$GQL&nLAx YUlq)bnnnG#oER4YBP3KX@CyvQ0W(N0ga7~l literal 0 HcmV?d00001 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8fc6ce1 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -0,0 +1,312 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; + 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; + 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; + 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE0A224B925CF003D1B0D /* Rotor.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 64FDE08424B8E42F003D1B0D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; + 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; + 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaMachine.hpp; sourceTree = ""; }; + 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RotorSet.cpp; sourceTree = ""; }; + 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RotorSet.hpp; sourceTree = ""; }; + 64FDE0A224B925CF003D1B0D /* Rotor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rotor.cpp; sourceTree = ""; }; + 64FDE0A324B925CF003D1B0D /* Rotor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Rotor.hpp; sourceTree = ""; }; + 64FDE0A624B926DC003D1B0D /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 64FDE0A724B926DC003D1B0D /* utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utils.hpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 64FDE08324B8E42F003D1B0D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 64FDE07D24B8E42F003D1B0D = { + isa = PBXGroup; + children = ( + 64FDE08824B8E42F003D1B0D /* EnigmaMachine */, + 64FDE08724B8E42F003D1B0D /* Products */, + ); + sourceTree = ""; + }; + 64FDE08724B8E42F003D1B0D /* Products */ = { + isa = PBXGroup; + children = ( + 64FDE08624B8E42F003D1B0D /* EnigmaMachine */, + ); + name = Products; + sourceTree = ""; + }; + 64FDE08824B8E42F003D1B0D /* EnigmaMachine */ = { + isa = PBXGroup; + children = ( + 64FDE0A524B926DC003D1B0D /* Utils */, + 64FDE0A224B925CF003D1B0D /* Rotor.cpp */, + 64FDE0A324B925CF003D1B0D /* Rotor.hpp */, + 64FDE08924B8E42F003D1B0D /* main.cpp */, + 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */, + 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */, + 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */, + 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, + ); + path = EnigmaMachine; + sourceTree = ""; + }; + 64FDE0A524B926DC003D1B0D /* Utils */ = { + isa = PBXGroup; + children = ( + 64FDE0A624B926DC003D1B0D /* config.h */, + 64FDE0A724B926DC003D1B0D /* utils.hpp */, + ); + path = Utils; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 64FDE08524B8E42F003D1B0D /* EnigmaMachine */ = { + isa = PBXNativeTarget; + buildConfigurationList = 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */; + buildPhases = ( + 64FDE08224B8E42F003D1B0D /* Sources */, + 64FDE08324B8E42F003D1B0D /* Frameworks */, + 64FDE08424B8E42F003D1B0D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = EnigmaMachine; + productName = EnigmaMachine; + productReference = 64FDE08624B8E42F003D1B0D /* EnigmaMachine */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 64FDE07E24B8E42F003D1B0D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Ayush Agrawal"; + TargetAttributes = { + 64FDE08524B8E42F003D1B0D = { + CreatedOnToolsVersion = 11.3; + }; + }; + }; + buildConfigurationList = 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 64FDE07D24B8E42F003D1B0D; + productRefGroup = 64FDE08724B8E42F003D1B0D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 64FDE08524B8E42F003D1B0D /* EnigmaMachine */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 64FDE08224B8E42F003D1B0D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, + 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, + 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, + 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 64FDE08B24B8E42F003D1B0D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 64FDE08C24B8E42F003D1B0D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + 64FDE08E24B8E42F003D1B0D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 562SMMQ9U5; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 64FDE08F24B8E42F003D1B0D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 562SMMQ9U5; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64FDE08B24B8E42F003D1B0D /* Debug */, + 64FDE08C24B8E42F003D1B0D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64FDE08E24B8E42F003D1B0D /* Debug */, + 64FDE08F24B8E42F003D1B0D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 64FDE07E24B8E42F003D1B0D /* Project object */; +} diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..94ff194 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..655876cb29899f1029e672ddfe7259128f5ec779 GIT binary patch literal 47207 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 aEwOKj?f;HEssH=-yYv6&o&SB8IR6Lln_Bw- literal 0 HcmV?d00001 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f43f716 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + EnigmaMachine.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp new file mode 100644 index 0000000..0246819 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -0,0 +1,35 @@ +// +// Enigma.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "EnigmaMachine.hpp" +#include "Utils/utils.hpp" + +EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS]): _rotorSet(rot_nos) { + for (int i = 0; i < 26; i++){ + _intCharMap.push_back('A' + i); + } +} + + +std::string EnigmaMachine::encode(std::string inputStr){ + std::string inpCopy = custom_utils::removeSpace(inputStr); + + inpCopy = custom_utils::toUppercase(inpCopy); + + std::string outputStr; + for (int i = 0; i < inpCopy.size(); i++){ + char charIn = (char) inpCopy[i]; + int intIn = _intCharMap.find( charIn ); + int intOut = _rotorSet.parseValue( intIn ); + char charOut = _intCharMap[intOut]; + + outputStr.push_back(charOut); + } + + return outputStr; +} diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp new file mode 100644 index 0000000..cc994e8 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -0,0 +1,21 @@ +// +// Enigma.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include "RotorSet.hpp" +#include +#include + +class EnigmaMachine { + RotorSet _rotorSet; + std::string _intCharMap; + +public: + EnigmaMachine(int rot_nos[NO_OF_ROTORS]); + std::string encode(std::string input); +}; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp new file mode 100644 index 0000000..7e393ae --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -0,0 +1,68 @@ +// +// Rotors.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// +// Rotor::runThrough adapted from Code_Bullet's code at https://github.com/Code-Bullet/Enigma-Simulator/blob/master/enigmaSim/Rotor.pde + +#include "Rotor.hpp" + +Rotor::Rotor(int rotorNumber, int rotorPosition) { + _rotorNo = rotorNumber; + _rotorPos = rotorPosition; + _offset = 0; + + setWiring(_rotorNo); +} + +void Rotor::setWiring(int no){ + switch(no) { + case ROTOR_1: + custom_utils::copyArr2D(_wiring, wiring_rotor1); + break; + case ROTOR_2: + custom_utils::copyArr2D(_wiring, wiring_rotor2); + break; + case ROTOR_3: + custom_utils::copyArr2D(_wiring, wiring_rotor3); + break; + case ROTOR_4: + custom_utils::copyArr2D(_wiring, wiring_rotor4); + break; + case ROTOR_5: + custom_utils::copyArr2D(_wiring, wiring_rotor5); + break; + case REFLECTOR: + custom_utils::copyArr2D(_wiring, wiring_reflector); + } +} + +int Rotor::runThrough(int input, bool forward){ + if (forward) { + input = (input + _offset) % 26; + + return _wiring[input][1]; + } else { + for (int i = 0; i< 26; i++) { + if (input == _wiring[i][1]) { + int output = ( _wiring[i][0]- _offset ) % 26; + + if (output < 0){ + output = 26 + output; + } + return output; + } + } + } + return -1; +} + +void Rotor::rotate(){ + _offset = (_offset + 1) % 26; +} + +int Rotor::position(){ + return _rotorPos; +} diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp new file mode 100644 index 0000000..b6bfea3 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -0,0 +1,29 @@ +// +// Rotors.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +#include "Utils/config.h" +#include "Utils/utils.hpp" + +class Rotor { +private: + int _offset; + int _rotorNo; + int _rotorPos; + int _wiring[26][2]; + + void setWiring(int no); + +public: + Rotor(){ }; + Rotor(int rotorNumber, int rotorPosition); + int runThrough(int input, bool forward = true); + void rotate(); + int position(); +}; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp new file mode 100644 index 0000000..2fb1067 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -0,0 +1,41 @@ +// +// RotorSet.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "RotorSet.hpp" + +RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS]) { + for (int i = 0; i < NO_OF_ROTORS; i++){ + _rotors[i] = Rotor(rot_nos[i], i+1); + } + _reflector = Rotor(REFLECTOR, 4); + + _rotationNo = 0; +} + + +int RotorSet::parseValue(int input){ + int value = input; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + value = _rotors[i].runThrough(value); + } + value = _reflector.runThrough(value); + for (int i = NO_OF_ROTORS - 1; i >= 0; i--){ + value = _rotors[i].runThrough(value, false); + } + + _rotationNo++; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + if (_rotationNo % (int)pow(26,i)){ + _rotors[i].rotate(); + } + } + + return value; +} diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp new file mode 100644 index 0000000..845c672 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -0,0 +1,26 @@ +// +// RotorSet.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +#include "Rotor.hpp" +#include + +#define NO_OF_ROTORS 3 + +class RotorSet { +private: + Rotor _rotors[NO_OF_ROTORS]; + Rotor _reflector; + + long int _rotationNo; + +public: + RotorSet(int rot_nos[NO_OF_ROTORS]); + int parseValue(int input); +}; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h new file mode 100644 index 0000000..8e13520 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -0,0 +1,42 @@ +// +// config.h +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +//Rotor names +#define ROTOR_1 1 +#define ROTOR_2 2 +#define ROTOR_3 3 +#define ROTOR_4 4 +#define ROTOR_5 5 +#define REFLECTOR 6 + +//Rotor Wirings +const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, + {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, + {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; + +const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, + {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, + {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; + +const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, + {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, + {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; + +const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, + {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, + {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; + +const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, + {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, + {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; + +const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, + {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, + {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp new file mode 100644 index 0000000..5a22ef7 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp @@ -0,0 +1,32 @@ +// +// ArrayFunctions.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include + +namespace custom_utils { + inline void copyArr2D(int arTo[26][2], const int arFrom[26][2], int size = 26){ + for (int i = 0; i < size; i++){ + for (int j = 0; j < 2; j++){ + arTo[i][j] = arFrom[i][j]; + } + } + } + + inline std::string removeSpace(std::string str){ + str.erase(remove_if(str.begin(), str.end(), isspace),str.end()); + + return str; + } + + inline std::string toUppercase(std::string str){ + std::transform(str.begin(), str.end(),str.begin(), ::toupper); + return str; + } + +} diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp new file mode 100644 index 0000000..1daad1f --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -0,0 +1,19 @@ +// +// main.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 10/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include +#include "EnigmaMachine.hpp" +#include "Utils/config.h" + +int main(int argc, const char * argv[]) { + int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; + EnigmaMachine enigmaMachine(rotorNumbers); + + std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; + +} From b998d26875ec66da111d742afff4aa2921f9b3d5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:30:43 +0530 Subject: [PATCH 03/16] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e502c69..2b6e61d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ # XCode project *.xcodeproj +xcuserdata/ From 2679077bd29a1c03e215a56afc12055db81f3d68 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:31:35 +0530 Subject: [PATCH 04/16] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2b6e61d..25115ba 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ # XCode project *.xcodeproj xcuserdata/ +EnigmaMachine.xcodeproj From 402a1d5661501820bbe387eaf2de0d3bddea4fc5 Mon Sep 17 00:00:00 2001 From: ayushagrawal24 Date: Sat, 11 Jul 2020 04:32:18 +0530 Subject: [PATCH 05/16] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 25115ba..4144fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ *.xcodeproj xcuserdata/ EnigmaMachine.xcodeproj +.DS_Store From 7cec8896bb01db28c45763f19d4b32e974d1c97d Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 16:27:51 +0530 Subject: [PATCH 06/16] Made dynamic and string-friendly --- .DS_Store | Bin 6148 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 47207 -> 49997 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 ++ EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 8 +- EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 2 +- EnigmaMachine/EnigmaMachine/Reflector.cpp | 47 +++++++++++ EnigmaMachine/EnigmaMachine/Reflector.hpp | 18 +++++ EnigmaMachine/EnigmaMachine/Rotor.cpp | 76 +++++++++++------- EnigmaMachine/EnigmaMachine/Rotor.hpp | 21 +++-- EnigmaMachine/EnigmaMachine/RotorSet.cpp | 41 +++++----- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 12 +-- EnigmaMachine/EnigmaMachine/Utils/config.h | 64 ++++++++++----- EnigmaMachine/EnigmaMachine/main.cpp | 2 +- 14 files changed, 213 insertions(+), 90 deletions(-) create mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 EnigmaMachine/EnigmaMachine/Reflector.cpp create mode 100644 EnigmaMachine/EnigmaMachine/Reflector.hpp diff --git a/.DS_Store b/.DS_Store index bca3b186422bad3d581261070390cf1b53faf320..9650a4e6c7fe1e0ed5972fedc106f4ba75c7f73a 100644 GIT binary patch delta 14 VcmZoMXffE3#>mLHIh}E?7yu&g1W*6~ delta 16 XcmZoMXffE3#yHuXQG9bPW4jmtFaiZY diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj index 8fc6ce1..e5ee540 100644 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */; }; 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; @@ -26,6 +27,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Reflector.cpp; sourceTree = ""; }; + 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Reflector.hpp; sourceTree = ""; }; 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; @@ -76,6 +79,8 @@ 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */, 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */, 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, + 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */, + 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */, ); path = EnigmaMachine; sourceTree = ""; @@ -148,6 +153,7 @@ files = ( 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, + 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */, 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, ); diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index 655876cb29899f1029e672ddfe7259128f5ec779..e4ecf5fee606698fb70993fc9a5a230e1d34030b 100644 GIT binary patch delta 24725 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 hG@ol)xN#fPo+j6yx`5)Zlk& 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 UsB5>&*)N7dU!&K*7YZyFAEdM1RR910 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..695f077 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp index 0246819..a96218f 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -9,7 +9,7 @@ #include "EnigmaMachine.hpp" #include "Utils/utils.hpp" -EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS]): _rotorSet(rot_nos) { +EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType): _rotorSet(rot_nos, reflectorType) { for (int i = 0; i < 26; i++){ _intCharMap.push_back('A' + i); } @@ -23,11 +23,7 @@ std::string EnigmaMachine::encode(std::string inputStr){ std::string outputStr; for (int i = 0; i < inpCopy.size(); i++){ - char charIn = (char) inpCopy[i]; - int intIn = _intCharMap.find( charIn ); - int intOut = _rotorSet.parseValue( intIn ); - char charOut = _intCharMap[intOut]; - + char charOut = _rotorSet.parseValue( inpCopy[i] ); outputStr.push_back(charOut); } diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp index cc994e8..a368281 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -16,6 +16,6 @@ class EnigmaMachine { std::string _intCharMap; public: - EnigmaMachine(int rot_nos[NO_OF_ROTORS]); + EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType); std::string encode(std::string input); }; diff --git a/EnigmaMachine/EnigmaMachine/Reflector.cpp b/EnigmaMachine/EnigmaMachine/Reflector.cpp new file mode 100644 index 0000000..b2de0ee --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Reflector.cpp @@ -0,0 +1,47 @@ +// +// Reflector.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "Reflector.hpp" + +Reflector::Reflector(int type){ + _rotorNo = type; + setWiring(_rotorNo); +} + +char Reflector::runThrough(char input, bool forward = true) { + int intInp; + char output; + + forward = true; + + intInp = alphabet.find(input); + output = _wiring[intInp]; + nextRot -> runThrough(output, false); + + return output; +} + +void Reflector::setWiring(int type){ + switch(type){ + case REFLECTOR_B: + _wiring = wiring_reflectorB; + break; + case REFLECTOR_B_THIN: + _wiring = wiring_reflectorB_thin; + break; + case REFLECTOR_C: + _wiring = wiring_reflectorC; + break; + case REFLECTOR_C_THIN: + _wiring = wiring_reflectorC_thin; + break; + default: + _wiring = alphabet; + break; + } +} diff --git a/EnigmaMachine/EnigmaMachine/Reflector.hpp b/EnigmaMachine/EnigmaMachine/Reflector.hpp new file mode 100644 index 0000000..f1a6ab0 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/Reflector.hpp @@ -0,0 +1,18 @@ +// +// Reflector.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once +#include "Rotor.hpp" + +class Reflector : public Rotor { +public: + Reflector(int type); + char runThrough(char input, bool forward); + void setWiring(int type); + void rotate() {}; +}; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index 7e393ae..48de88c 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -5,58 +5,74 @@ // Created by Ayush Agrawal on 10/07/20. // Copyright © 2020 Ayush Agrawal. All rights reserved. // -// Rotor::runThrough adapted from Code_Bullet's code at https://github.com/Code-Bullet/Enigma-Simulator/blob/master/enigmaSim/Rotor.pde #include "Rotor.hpp" -Rotor::Rotor(int rotorNumber, int rotorPosition) { +Rotor::Rotor(int rotorNumber) { _rotorNo = rotorNumber; - _rotorPos = rotorPosition; _offset = 0; - + + prevRot = nullptr; + nextRot = nullptr; + setWiring(_rotorNo); } -void Rotor::setWiring(int no){ - switch(no) { +void Rotor::setWiring(int type){ + switch(type) { case ROTOR_1: - custom_utils::copyArr2D(_wiring, wiring_rotor1); + _wiring = wiring_rotor1; + _notch = rot1_notch; break; case ROTOR_2: - custom_utils::copyArr2D(_wiring, wiring_rotor2); + _wiring = wiring_rotor1; + _notch = rot2_notch; break; case ROTOR_3: - custom_utils::copyArr2D(_wiring, wiring_rotor3); + _wiring = wiring_rotor1; + _notch = rot3_notch; break; case ROTOR_4: - custom_utils::copyArr2D(_wiring, wiring_rotor4); + _wiring = wiring_rotor1; + _notch = rot4_notch; break; case ROTOR_5: - custom_utils::copyArr2D(_wiring, wiring_rotor5); + _wiring = wiring_rotor1; + _notch = rot5_notch; + break; + default: + _wiring = alphabet; + _notch = 'A'; break; - case REFLECTOR: - custom_utils::copyArr2D(_wiring, wiring_reflector); } } -int Rotor::runThrough(int input, bool forward){ +char Rotor::runThrough(char input, bool forward){ + int intInp; + char output; + if (forward) { - input = (input + _offset) % 26; - - return _wiring[input][1]; + intInp = alphabet.find(input); + intInp = (intInp + _offset) % 26; + output = _wiring[intInp]; + nextRot -> runThrough(output, true); } else { - for (int i = 0; i< 26; i++) { - if (input == _wiring[i][1]) { - int output = ( _wiring[i][0]- _offset ) % 26; - - if (output < 0){ - output = 26 + output; - } - return output; - } + intInp = _wiring.find(input); + intInp = (intInp - _offset)%26; + if (intInp < 0){ + intInp += 26; } + output = alphabet[intInp]; + if(prevRot != nullptr){ + prevRot -> runThrough(output, false); + } + } + + if (_wiring[_offset] == _notch){ + nextRot -> rotate(); } - return -1; + + return output; } void Rotor::rotate(){ @@ -64,5 +80,9 @@ void Rotor::rotate(){ } int Rotor::position(){ - return _rotorPos; + return _offset; +} + +void Rotor::setOffset(int num){ + _offset = num % 26; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index b6bfea3..8dab831 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -11,19 +11,26 @@ #include "Utils/config.h" #include "Utils/utils.hpp" +#include + class Rotor { private: int _offset; - int _rotorNo; - int _rotorPos; - int _wiring[26][2]; + char _notch; - void setWiring(int no); +protected: + int _rotorNo; + std::string _wiring; public: + Rotor* nextRot; + Rotor* prevRot; + Rotor(){ }; - Rotor(int rotorNumber, int rotorPosition); - int runThrough(int input, bool forward = true); - void rotate(); + Rotor(int rotorNumber); + virtual char runThrough(char input, bool forward); + virtual void rotate(); int position(); + virtual void setWiring(int type); + void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index 2fb1067..a504c10 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -7,35 +7,32 @@ // #include "RotorSet.hpp" +#include -RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS]) { +RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { for (int i = 0; i < NO_OF_ROTORS; i++){ - _rotors[i] = Rotor(rot_nos[i], i+1); + _rotors[i] = new Rotor(rot_nos[i]); } - _reflector = Rotor(REFLECTOR, 4); + _reflector = new Reflector(reflectorType); - _rotationNo = 0; -} - - -int RotorSet::parseValue(int input){ - int value = input; - - for (int i = 0; i < NO_OF_ROTORS; i++){ - value = _rotors[i].runThrough(value); - } - value = _reflector.runThrough(value); - for (int i = NO_OF_ROTORS - 1; i >= 0; i--){ - value = _rotors[i].runThrough(value, false); + for (int i = 0; i < NO_OF_ROTORS - 1; i++){ + _rotors[i]->nextRot = _rotors[i+1]; + _rotors[i+1]->prevRot = _rotors[i]; } - _rotationNo++; - + _rotors[NO_OF_ROTORS - 1]->nextRot = _reflector; + _reflector->nextRot = _rotors[NO_OF_ROTORS - 1]; +} + +RotorSet::~RotorSet(){ for (int i = 0; i < NO_OF_ROTORS; i++){ - if (_rotationNo % (int)pow(26,i)){ - _rotors[i].rotate(); - } + delete _rotors[i]; } - +} + +int RotorSet::parseValue(char input){ + char value = _rotors[0]->runThrough(input, true); + _rotors[0] -> rotate(); + return value; } diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index 845c672..03e2b53 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -9,18 +9,18 @@ #pragma once #include "Rotor.hpp" +#include "Reflector.hpp" #include #define NO_OF_ROTORS 3 class RotorSet { private: - Rotor _rotors[NO_OF_ROTORS]; - Rotor _reflector; + Rotor* _rotors[NO_OF_ROTORS]; + Rotor* _reflector; - long int _rotationNo; - public: - RotorSet(int rot_nos[NO_OF_ROTORS]); - int parseValue(int input); + RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); + ~RotorSet(); + int parseValue(char input); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 8e13520..61599cf 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -8,35 +8,61 @@ #pragma once +#include + //Rotor names #define ROTOR_1 1 #define ROTOR_2 2 #define ROTOR_3 3 #define ROTOR_4 4 #define ROTOR_5 5 -#define REFLECTOR 6 +#define REFLECTOR_B 6 +#define REFLECTOR_B_THIN 7 +#define REFLECTOR_C 8 +#define REFLECTOR_C_THIN 9 //Rotor Wirings -const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, - {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, - {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; +//const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, +// {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, +// {18, 13}, {19, 16}, {20, 9}, {21, 22}, {22, 0}, {23, 24}, {24, 3}, {25, 10} }; +// +//const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, +// {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, +// {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; +// +//const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, +// {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, +// {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; +// +//const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, +// {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, +// {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; +// +//const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, +// {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, +// {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; +// +//const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, +// {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, +// {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; + -const int wiring_rotor2[][2] = { {0, 25}, {1, 14}, {2, 20}, {3, 4}, {4, 18}, {5, 24}, {6, 3}, {7, 10}, {8, 5}, - {9, 22}, {10, 15}, {11, 2}, {12, 8}, {13, 16}, {14, 23}, {15, 7}, {16, 12}, {17, 21}, - {18, 1}, {19, 11}, {20, 6}, {21, 13}, {22, 9}, {23, 17}, {24, 0}, {25, 19} }; +const std::string wiring_rotor1 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; +const std::string wiring_rotor2 = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; +const std::string wiring_rotor3 = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; +const std::string wiring_rotor4 = "ESOVPZJAYQUIRHXLNFTGKDCMWB"; +const std::string wiring_rotor5 = "VZBRGITYUPSDNHLXAWMJQOFECK"; +const std::string wiring_reflectorB = "VZBRGITYUPSDNHLXAWMJQOFECK"; +const std::string wiring_reflectorC = "FVPJIAOYEDRZXWGCTKUQSBNMHL"; +const std::string wiring_reflectorB_thin = "ENKQAUYWJICOPBLMDXZVFTHRGS"; +const std::string wiring_reflectorC_thin = "RDOBJNTKVEHMLFCWZAXGYIPSUQ"; +const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -const int wiring_rotor3[][2] = { {0, 4}, {1, 7}, {2, 17}, {3, 21}, {4, 23}, {5, 6}, {6, 0}, {7, 14}, {8, 1}, - {9, 16}, {10, 20}, {11, 18}, {12, 8}, {13, 12}, {14, 25}, {15, 5}, {16, 11}, {17, 24}, - {18, 13}, {19, 22}, {20, 10}, {21, 19}, {22, 15}, {23, 3}, {24, 9}, {25, 2} }; +const char rot1_notch = 'Q'; +const char rot2_notch = 'E'; +const char rot3_notch = 'V'; +const char rot4_notch = 'J'; +const char rot5_notch = 'Z'; -const int wiring_rotor4[][2] = { {0, 8}, {1, 12}, {2, 4}, {3, 19}, {4, 2}, {5, 6}, {6, 5}, {7, 17}, {8, 0}, - {9, 24}, {10, 18}, {11, 16}, {12, 1}, {13, 25}, {14, 23}, {15, 22}, {16, 11}, {17, 7}, - {18, 10}, {19, 3}, {20, 21}, {21, 20}, {22, 15}, {23, 14}, {24, 9}, {25, 13} }; -const int wiring_rotor5[][2] = { {0, 16}, {1, 22}, {2, 4}, {3, 17}, {4, 19}, {5, 25}, {6, 20}, {7, 8}, {8, 14}, - {9, 0}, {10, 18}, {11, 3}, {12, 5}, {13, 6}, {14, 7}, {15, 9}, {16, 10}, {17, 15}, - {18, 24}, {19, 23}, {20, 2}, {21, 21}, {22, 1}, {23, 13}, {24, 12}, {25, 11} }; -const int wiring_reflector[][2] = { {0, 21}, {1, 10}, {2, 22}, {3, 17}, {4, 6}, {5, 8}, {6, 4}, {7, 19}, {8, 5}, - {9, 25}, {10, 1}, {11, 20}, {12, 18}, {13, 15}, {14, 16}, {15, 13}, {16, 14}, {17, 3}, - {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 1daad1f..3a6f32c 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -12,7 +12,7 @@ int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; - EnigmaMachine enigmaMachine(rotorNumbers); + EnigmaMachine enigmaMachine(rotorNumbers, REFLECTOR_B); std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; From def93591cd05fadfbdf75bf9640cba443637875b Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 16:59:58 +0530 Subject: [PATCH 07/16] Added methods to change enigma configuration --- .../UserInterfaceState.xcuserstate | Bin 49997 -> 49448 bytes EnigmaMachine/EnigmaMachine/Reflector.cpp | 1 + EnigmaMachine/EnigmaMachine/Rotor.cpp | 2 + EnigmaMachine/EnigmaMachine/Rotor.hpp | 1 + EnigmaMachine/EnigmaMachine/RotorSet.cpp | 46 +++++++++++++++++- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 8 +++ EnigmaMachine/EnigmaMachine/Utils/config.h | 22 +++++---- 7 files changed, 70 insertions(+), 10 deletions(-) diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index e4ecf5fee606698fb70993fc9a5a230e1d34030b..69b92ccbf78c9a1603f6873dbfc54a772794ddee 100644 GIT binary patch delta 19410 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 delta 19939 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 diff --git a/EnigmaMachine/EnigmaMachine/Reflector.cpp b/EnigmaMachine/EnigmaMachine/Reflector.cpp index b2de0ee..e3afef0 100644 --- a/EnigmaMachine/EnigmaMachine/Reflector.cpp +++ b/EnigmaMachine/EnigmaMachine/Reflector.cpp @@ -27,6 +27,7 @@ char Reflector::runThrough(char input, bool forward = true) { } void Reflector::setWiring(int type){ + _rotorNo = type; switch(type){ case REFLECTOR_B: _wiring = wiring_reflectorB; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index 48de88c..ad4a992 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -19,6 +19,8 @@ Rotor::Rotor(int rotorNumber) { } void Rotor::setWiring(int type){ + _rotorNo = type; + switch(type) { case ROTOR_1: _wiring = wiring_rotor1; diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index 8dab831..c2c1ff4 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -31,6 +31,7 @@ class Rotor { virtual char runThrough(char input, bool forward); virtual void rotate(); int position(); + virtual void setWiring(int type); void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index a504c10..c979eee 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -7,7 +7,9 @@ // #include "RotorSet.hpp" -#include +#include +#include +#include RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { for (int i = 0; i < NO_OF_ROTORS; i++){ @@ -36,3 +38,45 @@ int RotorSet::parseValue(char input){ return value; } + + +void RotorSet::setRotorOffset(int rotPos, int offset){ + if (rotPos >= NO_OF_ROTORS) return; + offset %= 26; + _rotors[rotPos]->setOffset(offset); + _config[rotPos][1] = offset; +} + +void RotorSet::setReflectorType(int type){ + _reflector->setWiring(type); + _config[NO_OF_ROTORS][0] = type; +} + +void RotorSet::setRotorType(int rotPos, int type){ + if (rotPos >= NO_OF_ROTORS) return; + _rotors[rotPos]->setWiring(type); + _config[rotPos][0] = type; + +} + +void RotorSet::randomConfig(){ + srand(time(0)); + int type; int offset; + std::set typesUsed; + + for (int i = 0; i < NO_OF_ROTORS; i++){ + offset = rand() % 26; + + do { + type = rand() % NO_ROTOR_TYPES; + } while (typesUsed.count(type) > 0); + + typesUsed.insert(type); + + setRotorType(i, type); + setRotorOffset(i, offset); + } + + type = rand() % NO_REFLECTOR_TYPES; + setReflectorType(type); +} diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index 03e2b53..d79c593 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -19,8 +19,16 @@ class RotorSet { Rotor* _rotors[NO_OF_ROTORS]; Rotor* _reflector; + int _config[NO_OF_ROTORS+1][2]; + public: RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); ~RotorSet(); int parseValue(char input); + + void setRotorOffset(int rotPos, int offset); + void setRotorType(int rotPos, int type); + void setReflectorType(int type); + + void randomConfig(); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 61599cf..5b8ca52 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -11,15 +11,19 @@ #include //Rotor names -#define ROTOR_1 1 -#define ROTOR_2 2 -#define ROTOR_3 3 -#define ROTOR_4 4 -#define ROTOR_5 5 -#define REFLECTOR_B 6 -#define REFLECTOR_B_THIN 7 -#define REFLECTOR_C 8 -#define REFLECTOR_C_THIN 9 +#define ROTOR_1 0 +#define ROTOR_2 1 +#define ROTOR_3 2 +#define ROTOR_4 3 +#define ROTOR_5 4 + +#define REFLECTOR_B 0 +#define REFLECTOR_B_THIN 1 +#define REFLECTOR_C 2 +#define REFLECTOR_C_THIN 3 + +#define NO_ROTOR_TYPES 5 +#define NO_REFLECTOR_TYPES 4 //Rotor Wirings //const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, From adb74231a947c01f485c6d64706fd0f3e69ec2a3 Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 18:27:09 +0530 Subject: [PATCH 08/16] Bugfix --- .../UserInterfaceState.xcuserstate | Bin 49448 -> 49584 bytes EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 2 +- EnigmaMachine/EnigmaMachine/Reflector.cpp | 5 +++-- EnigmaMachine/EnigmaMachine/Rotor.cpp | 17 +++++++++-------- EnigmaMachine/EnigmaMachine/Utils/config.h | 17 +++++++++-------- EnigmaMachine/EnigmaMachine/Utils/utils.hpp | 4 +++- EnigmaMachine/EnigmaMachine/main.cpp | 12 ++++++++++-- 7 files changed, 35 insertions(+), 22 deletions(-) diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index 69b92ccbf78c9a1603f6873dbfc54a772794ddee..50358932dc89e589a8d4d93bf8d642926b31c114 100644 GIT binary patch delta 23065 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 delta 22978 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 Reflector::Reflector(int type){ _rotorNo = type; @@ -18,10 +19,10 @@ char Reflector::runThrough(char input, bool forward = true) { char output; forward = true; - + intInp = alphabet.find(input); output = _wiring[intInp]; - nextRot -> runThrough(output, false); + output = nextRot -> runThrough(output, false); return output; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index ad4a992..bf32125 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -7,6 +7,7 @@ // #include "Rotor.hpp" +#include Rotor::Rotor(int rotorNumber) { _rotorNo = rotorNumber; @@ -27,19 +28,19 @@ void Rotor::setWiring(int type){ _notch = rot1_notch; break; case ROTOR_2: - _wiring = wiring_rotor1; + _wiring = wiring_rotor2; _notch = rot2_notch; break; case ROTOR_3: - _wiring = wiring_rotor1; + _wiring = wiring_rotor3; _notch = rot3_notch; break; case ROTOR_4: - _wiring = wiring_rotor1; + _wiring = wiring_rotor4; _notch = rot4_notch; break; case ROTOR_5: - _wiring = wiring_rotor1; + _wiring = wiring_rotor5; _notch = rot5_notch; break; default: @@ -53,11 +54,12 @@ char Rotor::runThrough(char input, bool forward){ int intInp; char output; + if (forward) { intInp = alphabet.find(input); intInp = (intInp + _offset) % 26; output = _wiring[intInp]; - nextRot -> runThrough(output, true); + output = nextRot -> runThrough(output, true); } else { intInp = _wiring.find(input); intInp = (intInp - _offset)%26; @@ -66,14 +68,13 @@ char Rotor::runThrough(char input, bool forward){ } output = alphabet[intInp]; if(prevRot != nullptr){ - prevRot -> runThrough(output, false); + output = prevRot -> runThrough(output, false); } } - if (_wiring[_offset] == _notch){ + if (alphabet[_offset] == _notch){ nextRot -> rotate(); } - return output; } diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 5b8ca52..d21ae7d 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -51,16 +51,17 @@ // {18, 12}, {19, 7}, {20, 11}, {21, 0}, {22, 2}, {23, 24}, {24, 23}, {25, 9} }; -const std::string wiring_rotor1 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; -const std::string wiring_rotor2 = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; -const std::string wiring_rotor3 = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; -const std::string wiring_rotor4 = "ESOVPZJAYQUIRHXLNFTGKDCMWB"; -const std::string wiring_rotor5 = "VZBRGITYUPSDNHLXAWMJQOFECK"; -const std::string wiring_reflectorB = "VZBRGITYUPSDNHLXAWMJQOFECK"; -const std::string wiring_reflectorC = "FVPJIAOYEDRZXWGCTKUQSBNMHL"; +const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +const std::string wiring_rotor1 = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; +const std::string wiring_rotor2 = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; +const std::string wiring_rotor3 = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; +const std::string wiring_rotor4 = "ESOVPZJAYQUIRHXLNFTGKDCMWB"; +const std::string wiring_rotor5 = "VZBRGITYUPSDNHLXAWMJQOFECK"; +const std::string wiring_reflectorB = "EJMZALYXVBWFCRQUONTSPIKHGD"; +const std::string wiring_reflectorC = "FVPJIAOYEDRZXWGCTKUQSBNMHL"; const std::string wiring_reflectorB_thin = "ENKQAUYWJICOPBLMDXZVFTHRGS"; const std::string wiring_reflectorC_thin = "RDOBJNTKVEHMLFCWZAXGYIPSUQ"; -const std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char rot1_notch = 'Q'; const char rot2_notch = 'E'; diff --git a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp index 5a22ef7..9734211 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp +++ b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp @@ -18,8 +18,10 @@ namespace custom_utils { } } - inline std::string removeSpace(std::string str){ + inline std::string removeSpecial(std::string str){ str.erase(remove_if(str.begin(), str.end(), isspace),str.end()); + str.erase(remove_if(str.begin(), str.end(), isdigit),str.end()); + str.erase(remove_if(str.begin(), str.end(), ispunct),str.end()); return str; } diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 3a6f32c..3b3543f 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -7,13 +7,21 @@ // #include +#include #include "EnigmaMachine.hpp" #include "Utils/config.h" int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; - EnigmaMachine enigmaMachine(rotorNumbers, REFLECTOR_B); + EnigmaMachine enigmaMachine1(rotorNumbers, REFLECTOR_B); + EnigmaMachine enigmaMachine2(rotorNumbers, REFLECTOR_B); - std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; + std::string message; + getline(std::cin, message); + + std::string encoded = enigmaMachine1.encode(message); + + std::cout << encoded << "\n"; + std::cout << enigmaMachine2.encode(encoded) << "\n"; } From 56d330a82d32976ed8cf8867e879f2e478faf3df Mon Sep 17 00:00:00 2001 From: Rajat Agarwal Date: Sat, 11 Jul 2020 21:57:34 +0530 Subject: [PATCH 09/16] set up eclipse IDE --- .cproject | 927 ++++++++++++++++++ .project | 71 ++ .../org.eclipse.cdt.managedbuilder.core.prefs | 26 + EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 2 +- EnigmaMachine/EnigmaMachine/Rotor.cpp | 12 +- EnigmaMachine/EnigmaMachine/Rotor.hpp | 8 +- EnigmaMachine/EnigmaMachine/RotorSet.cpp | 16 +- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 8 +- EnigmaMachine/EnigmaMachine/Utils/config.h | 3 - EnigmaMachine/EnigmaMachine/Utils/utils.hpp | 10 +- EnigmaMachine/EnigmaMachine/main.cpp | 8 +- 11 files changed, 1058 insertions(+), 33 deletions(-) create mode 100644 .cproject create mode 100644 .project create mode 100644 .settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..5e0c132 --- /dev/null +++ b/.cproject @@ -0,0 +1,927 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..ec53fe2 --- /dev/null +++ b/.project @@ -0,0 +1,71 @@ + + + EnigmaSim + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/EnigmaSim/Debug} + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..d4cc1e6 --- /dev/null +++ b/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,26 @@ +#Sat Jul 11 20:12:08 IST 2020 +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp index a368281..f0d031a 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -14,7 +14,7 @@ class EnigmaMachine { RotorSet _rotorSet; std::string _intCharMap; - + public: EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType); std::string encode(std::string input); diff --git a/EnigmaMachine/EnigmaMachine/Rotor.cpp b/EnigmaMachine/EnigmaMachine/Rotor.cpp index ad4a992..d0eaf10 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.cpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.cpp @@ -11,16 +11,16 @@ Rotor::Rotor(int rotorNumber) { _rotorNo = rotorNumber; _offset = 0; - + prevRot = nullptr; nextRot = nullptr; - + setWiring(_rotorNo); } void Rotor::setWiring(int type){ _rotorNo = type; - + switch(type) { case ROTOR_1: _wiring = wiring_rotor1; @@ -52,7 +52,7 @@ void Rotor::setWiring(int type){ char Rotor::runThrough(char input, bool forward){ int intInp; char output; - + if (forward) { intInp = alphabet.find(input); intInp = (intInp + _offset) % 26; @@ -69,11 +69,11 @@ char Rotor::runThrough(char input, bool forward){ prevRot -> runThrough(output, false); } } - + if (_wiring[_offset] == _notch){ nextRot -> rotate(); } - + return output; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index c2c1ff4..fb12f70 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -17,21 +17,21 @@ class Rotor { private: int _offset; char _notch; - + protected: int _rotorNo; std::string _wiring; - + public: Rotor* nextRot; Rotor* prevRot; - + Rotor(){ }; Rotor(int rotorNumber); virtual char runThrough(char input, bool forward); virtual void rotate(); int position(); - + virtual void setWiring(int type); void setOffset(int num); }; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index c979eee..2c75562 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -16,12 +16,12 @@ RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { _rotors[i] = new Rotor(rot_nos[i]); } _reflector = new Reflector(reflectorType); - + for (int i = 0; i < NO_OF_ROTORS - 1; i++){ _rotors[i]->nextRot = _rotors[i+1]; _rotors[i+1]->prevRot = _rotors[i]; } - + _rotors[NO_OF_ROTORS - 1]->nextRot = _reflector; _reflector->nextRot = _rotors[NO_OF_ROTORS - 1]; } @@ -35,7 +35,7 @@ RotorSet::~RotorSet(){ int RotorSet::parseValue(char input){ char value = _rotors[0]->runThrough(input, true); _rotors[0] -> rotate(); - + return value; } @@ -63,20 +63,20 @@ void RotorSet::randomConfig(){ srand(time(0)); int type; int offset; std::set typesUsed; - + for (int i = 0; i < NO_OF_ROTORS; i++){ offset = rand() % 26; - + do { type = rand() % NO_ROTOR_TYPES; } while (typesUsed.count(type) > 0); - + typesUsed.insert(type); - + setRotorType(i, type); setRotorOffset(i, offset); } - + type = rand() % NO_REFLECTOR_TYPES; setReflectorType(type); } diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index d79c593..6f8cec7 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -18,17 +18,17 @@ class RotorSet { private: Rotor* _rotors[NO_OF_ROTORS]; Rotor* _reflector; - + int _config[NO_OF_ROTORS+1][2]; - + public: RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); ~RotorSet(); int parseValue(char input); - + void setRotorOffset(int rotPos, int offset); void setRotorType(int rotPos, int type); void setReflectorType(int type); - + void randomConfig(); }; diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index 5b8ca52..f69fe5a 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -67,6 +67,3 @@ const char rot2_notch = 'E'; const char rot3_notch = 'V'; const char rot4_notch = 'J'; const char rot5_notch = 'Z'; - - - diff --git a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp index 5a22ef7..e1d531c 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/utils.hpp +++ b/EnigmaMachine/EnigmaMachine/Utils/utils.hpp @@ -8,7 +8,7 @@ #pragma once #include - +#include namespace custom_utils { inline void copyArr2D(int arTo[26][2], const int arFrom[26][2], int size = 26){ for (int i = 0; i < size; i++){ @@ -17,16 +17,16 @@ namespace custom_utils { } } } - + inline std::string removeSpace(std::string str){ str.erase(remove_if(str.begin(), str.end(), isspace),str.end()); - + return str; } - + inline std::string toUppercase(std::string str){ std::transform(str.begin(), str.end(),str.begin(), ::toupper); return str; } - + } diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 3a6f32c..c3a84a9 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -13,7 +13,11 @@ int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; EnigmaMachine enigmaMachine(rotorNumbers, REFLECTOR_B); - + int a; + + std::cout << enigmaMachine.encode("NANANANANA BATMAN") << "\n"; - + return 0; + + } From c94c67fecb5728dd48137175756422274249bee0 Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sat, 11 Jul 2020 22:57:35 +0530 Subject: [PATCH 10/16] Added ability to set offsets at setup --- .DS_Store | Bin 6148 -> 6148 bytes EnigmaMachine/.DS_Store | Bin 6148 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 6 ++++++ .../UserInterfaceState.xcuserstate | Bin 49584 -> 54637 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 ++++++++++++++++++ EnigmaMachine/EnigmaMachine/.DS_Store | Bin 0 -> 6148 bytes .../EnigmaMachine/EnigmaDecrypter.cpp | 9 +++++++++ .../EnigmaMachine/EnigmaDecrypter.hpp | 9 +++++++++ EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 9 +++------ EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 3 +-- EnigmaMachine/EnigmaMachine/Rotor.cpp | 14 +++++++------- EnigmaMachine/EnigmaMachine/Rotor.hpp | 2 +- EnigmaMachine/EnigmaMachine/RotorSet.cpp | 4 ++-- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 2 +- EnigmaMachine/EnigmaMachine/main.cpp | 16 ++++++++++++++-- 15 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 EnigmaMachine/EnigmaMachine/.DS_Store create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp create mode 100644 EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp diff --git a/.DS_Store b/.DS_Store index 9650a4e6c7fe1e0ed5972fedc106f4ba75c7f73a..844dc258345c34f413d260946bb7491ff1b11e29 100644 GIT binary patch delta 47 zcmZoMXfc@J&&WD4U^gS{WFAKQ$tsM}oM|b=$w~S7IgFD%7;PCDH&0}YV%yBl@s}R} DMp_Mq delta 34 qcmZoMXfc@J&&V<{U^gSnWFAKQ$wiD-n>R9su}v({+04%ImmdJS01C+f diff --git a/EnigmaMachine/.DS_Store b/EnigmaMachine/.DS_Store index 9fa36f4de111691834bb18c625dd593f6456e24e..cbf52bcc00ae44dc114fa5d07a43f9abd77a0d5d 100644 GIT binary patch delta 163 zcmZoMXfc=|#>B)qu~2NHo+2aL#DLw4FEBDPvQ6e;)SArCD9w_VQk* delta 89 zcmZoMXfc=|#>B`mu~2NHo+2aj#DLw5%#(STv?kAI(x2SJ#LLWZJ81G8CZoww%zTUj rn+utzv21Q&-p#m~or9kPs1Ydgoq009h$ROD5HK<@Fl`PH*}@C}F_0EC diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj index e5ee540..4d26204 100644 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */; }; + 642ADE3324BA2C0900C0A06A /* EnigmaDecrypter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */; }; 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; @@ -29,6 +30,8 @@ /* Begin PBXFileReference section */ 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Reflector.cpp; sourceTree = ""; }; 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Reflector.hpp; sourceTree = ""; }; + 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaDecrypter.cpp; sourceTree = ""; }; + 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaDecrypter.hpp; sourceTree = ""; }; 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; @@ -81,6 +84,8 @@ 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */, 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */, + 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */, + 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */, ); path = EnigmaMachine; sourceTree = ""; @@ -156,6 +161,7 @@ 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */, 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, + 642ADE3324BA2C0900C0A06A /* EnigmaDecrypter.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index 50358932dc89e589a8d4d93bf8d642926b31c114..076b37b12bdc33aee86e364b903cff806f04e71c 100644 GIT binary patch delta 27412 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 K&dS>P@_zvz(*l4!{(gf?NiCyeiqOluI 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 diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 695f077..4e7a134 100644 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,4 +3,22 @@ uuid = "160A0ECF-CD35-461C-A062-149D32F48C6A" type = "1" version = "2.0"> + + + + + + diff --git a/EnigmaMachine/EnigmaMachine/.DS_Store b/EnigmaMachine/EnigmaMachine/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6c26ee13d6abf4f004b613af1d28df572fcccd19 GIT binary patch literal 6148 zcmeH~JqiLr422VaK(Mj2oW=uqgF*BJVlOI!AXupV9Nm{61XpVjd4c53WD;e+VrL^F zy0{VnwOF)Yypf$CHA_LQCg+{CT z7-D&EhnB3XsVy|xMRWMj{AaZ(2By(2TCjm>bzvX@66g@<$9`h>{|f$T{_nJKO9CYD zX9RSxTrU@RsJvU>9?$aI%-Xuap -Rotor::Rotor(int rotorNumber) { +Rotor::Rotor(int rotorNumber, int offset) { _rotorNo = rotorNumber; - _offset = 0; + _offset = offset; prevRot = nullptr; nextRot = nullptr; @@ -54,7 +54,6 @@ char Rotor::runThrough(char input, bool forward){ int intInp; char output; - if (forward) { intInp = alphabet.find(input); intInp = (intInp + _offset) % 26; @@ -70,11 +69,12 @@ char Rotor::runThrough(char input, bool forward){ if(prevRot != nullptr){ output = prevRot -> runThrough(output, false); } + + if (alphabet[_offset] == _notch){ + nextRot -> rotate(); + } } - - if (alphabet[_offset] == _notch){ - nextRot -> rotate(); - } + return output; } diff --git a/EnigmaMachine/EnigmaMachine/Rotor.hpp b/EnigmaMachine/EnigmaMachine/Rotor.hpp index c2c1ff4..3b2d0a3 100644 --- a/EnigmaMachine/EnigmaMachine/Rotor.hpp +++ b/EnigmaMachine/EnigmaMachine/Rotor.hpp @@ -27,7 +27,7 @@ class Rotor { Rotor* prevRot; Rotor(){ }; - Rotor(int rotorNumber); + Rotor(int rotorNumber, int offset); virtual char runThrough(char input, bool forward); virtual void rotate(); int position(); diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index c979eee..a765f4d 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -11,9 +11,9 @@ #include #include -RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType) { +RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]) { for (int i = 0; i < NO_OF_ROTORS; i++){ - _rotors[i] = new Rotor(rot_nos[i]); + _rotors[i] = new Rotor(rot_nos[i], offsets[i]); } _reflector = new Reflector(reflectorType); diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index d79c593..b3d9585 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -22,7 +22,7 @@ class RotorSet { int _config[NO_OF_ROTORS+1][2]; public: - RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType); + RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]); ~RotorSet(); int parseValue(char input); diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 3b3543f..57dd69e 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -10,11 +10,23 @@ #include #include "EnigmaMachine.hpp" #include "Utils/config.h" +#include +#include + int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; - EnigmaMachine enigmaMachine1(rotorNumbers, REFLECTOR_B); - EnigmaMachine enigmaMachine2(rotorNumbers, REFLECTOR_B); + int offsets[NO_OF_ROTORS]; + + srand(time(0)); + + for (int i = 0; i < NO_OF_ROTORS; i++){ + offsets[i] = rand() % 26; + std::cout << offsets[i] << " "; + } + + EnigmaMachine enigmaMachine1(rotorNumbers, REFLECTOR_B, offsets); + EnigmaMachine enigmaMachine2(rotorNumbers, REFLECTOR_B, offsets); std::string message; From 494a8f5cb60afc3336ed3c262833ddde6d24718e Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sun, 12 Jul 2020 00:00:11 +0530 Subject: [PATCH 11/16] Added RotorConfig struct --- EnigmaMachine/.DS_Store | Bin 6148 -> 6148 bytes .../EnigmaMachine.xcodeproj/project.pbxproj | 6 ++++ .../UserInterfaceState.xcuserstate | Bin 54637 -> 56204 bytes .../EnigmaMachine/EnigmaDecrypter.hpp | 18 ++++++++++++ EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 4 +-- EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 8 ++++-- EnigmaMachine/EnigmaMachine/Reflector.hpp | 2 ++ EnigmaMachine/EnigmaMachine/RotorConfig.cpp | 26 ++++++++++++++++++ EnigmaMachine/EnigmaMachine/RotorConfig.hpp | 21 ++++++++++++++ EnigmaMachine/EnigmaMachine/RotorSet.cpp | 18 ++++++------ EnigmaMachine/EnigmaMachine/RotorSet.hpp | 14 ++++++---- EnigmaMachine/EnigmaMachine/Utils/config.h | 2 ++ EnigmaMachine/EnigmaMachine/main.cpp | 13 ++++++--- 13 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 EnigmaMachine/EnigmaMachine/RotorConfig.cpp create mode 100644 EnigmaMachine/EnigmaMachine/RotorConfig.hpp diff --git a/EnigmaMachine/.DS_Store b/EnigmaMachine/.DS_Store index cbf52bcc00ae44dc114fa5d07a43f9abd77a0d5d..19cb128fecb2ae68884c04c996d445f903d7af8c 100644 GIT binary patch delta 25 hcmZoMXffC@i-}3>(&RZzcB~CkeC~>GzR#p83IKVy2{ix! delta 23 fcmZoMXffC@i;0QPVDcO$yU7a7R+~kbKZpPTSnvlT diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj index 4d26204..6cbac0c 100644 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj +++ b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */; }; 642ADE3324BA2C0900C0A06A /* EnigmaDecrypter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */; }; + 642ADE3624BA2FB900C0A06A /* RotorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */; }; 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; @@ -32,6 +33,8 @@ 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Reflector.hpp; sourceTree = ""; }; 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaDecrypter.cpp; sourceTree = ""; }; 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaDecrypter.hpp; sourceTree = ""; }; + 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RotorConfig.cpp; sourceTree = ""; }; + 642ADE3524BA2FB900C0A06A /* RotorConfig.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RotorConfig.hpp; sourceTree = ""; }; 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; @@ -86,6 +89,8 @@ 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */, 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */, 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */, + 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */, + 642ADE3524BA2FB900C0A06A /* RotorConfig.hpp */, ); path = EnigmaMachine; sourceTree = ""; @@ -157,6 +162,7 @@ buildActionMask = 2147483647; files = ( 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, + 642ADE3624BA2FB900C0A06A /* RotorConfig.cpp in Sources */, 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */, 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate index 076b37b12bdc33aee86e364b903cff806f04e71c..3695d90158211f90eefb53fcf2f2a58471c5a865 100644 GIT binary patch delta 25925 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 z za)brKB4M?#PRJ7+0w6%bCSkjZK6X2MOfS>5~3jP7QYuyi|54#@sijiUK4MKH^n>RJ+V#dBE2M~ zN@>zSX|Oax8YPXE-j*_?Po!B=u7pVWQh`(`6-gyhnN;qQFo~2r5-l+jC+(5;N(ZEa z(qZYCbX+DrTULfbn zOXOwp3K^BR$R%=_TrOjBK;~spmSt78Wek%C5(9v)m%L z#oEXE#8P9UV{gSihaWN})G*%z`Q+Yw@rX(x9ls?K! z$|PlmGDn%GEL0XNOO*8rq7*2FN|92ce4`MGp;Rg7mEV+W%5~+Y@>FS2o~!NEo@%Pv zUrkpBsUy@6UFsxtp}Jh%p}N)m>M`|%dRnbho78LS4fU3KSADEDt1W6kZL79jBQ=jkYmCNfF)gkcn#k?pMdjd~L2_sRPIGy+-@mJ!x+1~7EzF>AU`S!$M+E5JFVT;ch)}ZuyxEjZk@8uSQo9| Ytk#{K_e}erwI}_zJ-7cqweOknZ;s|23jhEB delta 25211 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 diff --git a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp index ce6254c..deb53b5 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp @@ -7,3 +7,21 @@ // #pragma once + +#include "EnigmaMachine.hpp" +#include "RotorConfig.hpp" + +class EnigmaDecrypter { +private: + EnigmaMachine _enigmaMachine; + RotorConfig _config; + bool _keyFound; + +public: + EnigmaDecrypter(); + void offsetIterator(); + void rotorTypeIterator(); + void reflectorIterator(); + bool run(); + std::string decrypt(std::string inp); +}; diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp index d90919c..2adbb53 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -9,9 +9,7 @@ #include "EnigmaMachine.hpp" #include "Utils/utils.hpp" -EnigmaMachine::EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]): - _rotorSet(rot_nos, reflectorType, offsets) { } - +EnigmaMachine::EnigmaMachine(RotorConfig r_config): _rotorSet(r_config) { } std::string EnigmaMachine::encode(std::string inputStr){ std::string inpCopy = custom_utils::removeSpecial(inputStr); diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp index b2916ad..2d435de 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp @@ -7,14 +7,18 @@ // #pragma once -#include "RotorSet.hpp" + #include #include +#include "RotorSet.hpp" +#include "RotorConfig.hpp" +#include "Utils/config.h" + class EnigmaMachine { RotorSet _rotorSet; public: - EnigmaMachine(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]); + EnigmaMachine(RotorConfig r_config); std::string encode(std::string input); }; diff --git a/EnigmaMachine/EnigmaMachine/Reflector.hpp b/EnigmaMachine/EnigmaMachine/Reflector.hpp index f1a6ab0..0b52111 100644 --- a/EnigmaMachine/EnigmaMachine/Reflector.hpp +++ b/EnigmaMachine/EnigmaMachine/Reflector.hpp @@ -7,7 +7,9 @@ // #pragma once + #include "Rotor.hpp" +#include "Utils/config.h" class Reflector : public Rotor { public: diff --git a/EnigmaMachine/EnigmaMachine/RotorConfig.cpp b/EnigmaMachine/EnigmaMachine/RotorConfig.cpp new file mode 100644 index 0000000..5aedcf7 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorConfig.cpp @@ -0,0 +1,26 @@ +// +// RotorConfig.cpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#include "RotorConfig.hpp" + +RotorConfig::RotorConfig(int r_offsets[NO_OF_ROTORS], int r_types[NO_OF_ROTORS], int r_reflectorType){ + for (int i = 0; i < NO_OF_ROTORS; i++){ + offsets[i] = r_offsets[i]; + types[i] = r_types[i]; + } + reflectorType = r_reflectorType; +} + +bool RotorConfig::operator == (const RotorConfig& rhs){ + for (int i = 0; i < NO_OF_ROTORS; i++){ + if (offsets[i] != rhs.offsets[i] || types[i] != rhs.types[i]){ + return false; + } + } + return reflectorType == rhs.reflectorType; +} diff --git a/EnigmaMachine/EnigmaMachine/RotorConfig.hpp b/EnigmaMachine/EnigmaMachine/RotorConfig.hpp new file mode 100644 index 0000000..aa4b115 --- /dev/null +++ b/EnigmaMachine/EnigmaMachine/RotorConfig.hpp @@ -0,0 +1,21 @@ +// +// RotorConfig.hpp +// EnigmaMachine +// +// Created by Ayush Agrawal on 11/07/20. +// Copyright © 2020 Ayush Agrawal. All rights reserved. +// + +#pragma once + +#include "Utils/config.h" + +struct RotorConfig { + int offsets[NO_OF_ROTORS]; + int types[NO_OF_ROTORS]; + int reflectorType; + + RotorConfig(int r_offsets[NO_OF_ROTORS], int r_types[NO_OF_ROTORS], int r_reflectorType); + + bool operator == (const RotorConfig& rhs); +}; diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.cpp b/EnigmaMachine/EnigmaMachine/RotorSet.cpp index a765f4d..c1a3654 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.cpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.cpp @@ -7,15 +7,12 @@ // #include "RotorSet.hpp" -#include -#include -#include -RotorSet::RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]) { +RotorSet::RotorSet(RotorConfig r_config): _config(r_config) { for (int i = 0; i < NO_OF_ROTORS; i++){ - _rotors[i] = new Rotor(rot_nos[i], offsets[i]); + _rotors[i] = new Rotor ( _config.types[i], _config.offsets[i] ); } - _reflector = new Reflector(reflectorType); + _reflector = new Reflector ( _config.reflectorType ); for (int i = 0; i < NO_OF_ROTORS - 1; i++){ _rotors[i]->nextRot = _rotors[i+1]; @@ -42,20 +39,23 @@ int RotorSet::parseValue(char input){ void RotorSet::setRotorOffset(int rotPos, int offset){ if (rotPos >= NO_OF_ROTORS) return; + offset %= 26; _rotors[rotPos]->setOffset(offset); - _config[rotPos][1] = offset; + + _config.offsets[rotPos] = offset; } void RotorSet::setReflectorType(int type){ _reflector->setWiring(type); - _config[NO_OF_ROTORS][0] = type; + _config.reflectorType = type; } void RotorSet::setRotorType(int rotPos, int type){ if (rotPos >= NO_OF_ROTORS) return; + _rotors[rotPos]->setWiring(type); - _config[rotPos][0] = type; + _config.types[rotPos] = type; } diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index b3d9585..033caf1 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -8,21 +8,25 @@ #pragma once -#include "Rotor.hpp" -#include "Reflector.hpp" #include +#include +#include +#include -#define NO_OF_ROTORS 3 +#include "Rotor.hpp" +#include "Reflector.hpp" +#include "RotorConfig.hpp" +#include "Utils/config.h" class RotorSet { private: Rotor* _rotors[NO_OF_ROTORS]; Rotor* _reflector; - int _config[NO_OF_ROTORS+1][2]; + RotorConfig _config; public: - RotorSet(int rot_nos[NO_OF_ROTORS], int reflectorType, int offsets[NO_OF_ROTORS]); + RotorSet(RotorConfig r_config); ~RotorSet(); int parseValue(char input); diff --git a/EnigmaMachine/EnigmaMachine/Utils/config.h b/EnigmaMachine/EnigmaMachine/Utils/config.h index d21ae7d..15be3fd 100644 --- a/EnigmaMachine/EnigmaMachine/Utils/config.h +++ b/EnigmaMachine/EnigmaMachine/Utils/config.h @@ -25,6 +25,8 @@ #define NO_ROTOR_TYPES 5 #define NO_REFLECTOR_TYPES 4 +#define NO_OF_ROTORS 3 + //Rotor Wirings //const int wiring_rotor1[][2] = { {0, 15}, {1, 4}, {2, 25}, {3, 20}, {4, 14}, {5, 7}, {6, 23}, {7, 18}, {8, 2}, // {9, 21}, {10, 5}, {11, 12}, {12, 19}, {13, 1}, {14, 6}, {15, 11}, {16, 17}, {17, 8}, diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 57dd69e..9f0832c 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -8,15 +8,18 @@ #include #include -#include "EnigmaMachine.hpp" -#include "Utils/config.h" #include #include +#include "EnigmaMachine.hpp" +#include "Utils/config.h" +#include "RotorConfig.hpp" + int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; int offsets[NO_OF_ROTORS]; + srand(time(0)); @@ -25,8 +28,10 @@ int main(int argc, const char * argv[]) { std::cout << offsets[i] << " "; } - EnigmaMachine enigmaMachine1(rotorNumbers, REFLECTOR_B, offsets); - EnigmaMachine enigmaMachine2(rotorNumbers, REFLECTOR_B, offsets); + RotorConfig rConfig(offsets, rotorNumbers, REFLECTOR_B); + + EnigmaMachine enigmaMachine1(rConfig); + EnigmaMachine enigmaMachine2(rConfig); std::string message; From d65039db52a7cacc04ee406055e8bca7b33001dd Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sun, 12 Jul 2020 00:05:29 +0530 Subject: [PATCH 12/16] Attempt at fixing xcode gitignore --- .../EnigmaMachine.xcodeproj/project.pbxproj | 330 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../UserInterfaceState.xcuserstate | Bin 56443 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 -- .../xcschemes/xcschememanagement.plist | 14 - 6 files changed, 383 deletions(-) delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj b/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj deleted file mode 100644 index 6cbac0c..0000000 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.pbxproj +++ /dev/null @@ -1,330 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */; }; - 642ADE3324BA2C0900C0A06A /* EnigmaDecrypter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */; }; - 642ADE3624BA2FB900C0A06A /* RotorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */; }; - 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE08924B8E42F003D1B0D /* main.cpp */; }; - 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */; }; - 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */; }; - 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64FDE0A224B925CF003D1B0D /* Rotor.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 64FDE08424B8E42F003D1B0D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Reflector.cpp; sourceTree = ""; }; - 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Reflector.hpp; sourceTree = ""; }; - 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaDecrypter.cpp; sourceTree = ""; }; - 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaDecrypter.hpp; sourceTree = ""; }; - 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RotorConfig.cpp; sourceTree = ""; }; - 642ADE3524BA2FB900C0A06A /* RotorConfig.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RotorConfig.hpp; sourceTree = ""; }; - 64FDE08624B8E42F003D1B0D /* EnigmaMachine */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnigmaMachine; sourceTree = BUILT_PRODUCTS_DIR; }; - 64FDE08924B8E42F003D1B0D /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; - 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnigmaMachine.cpp; sourceTree = ""; }; - 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnigmaMachine.hpp; sourceTree = ""; }; - 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RotorSet.cpp; sourceTree = ""; }; - 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = RotorSet.hpp; sourceTree = ""; }; - 64FDE0A224B925CF003D1B0D /* Rotor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rotor.cpp; sourceTree = ""; }; - 64FDE0A324B925CF003D1B0D /* Rotor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Rotor.hpp; sourceTree = ""; }; - 64FDE0A624B926DC003D1B0D /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; - 64FDE0A724B926DC003D1B0D /* utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utils.hpp; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 64FDE08324B8E42F003D1B0D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 64FDE07D24B8E42F003D1B0D = { - isa = PBXGroup; - children = ( - 64FDE08824B8E42F003D1B0D /* EnigmaMachine */, - 64FDE08724B8E42F003D1B0D /* Products */, - ); - sourceTree = ""; - }; - 64FDE08724B8E42F003D1B0D /* Products */ = { - isa = PBXGroup; - children = ( - 64FDE08624B8E42F003D1B0D /* EnigmaMachine */, - ); - name = Products; - sourceTree = ""; - }; - 64FDE08824B8E42F003D1B0D /* EnigmaMachine */ = { - isa = PBXGroup; - children = ( - 64FDE0A524B926DC003D1B0D /* Utils */, - 64FDE0A224B925CF003D1B0D /* Rotor.cpp */, - 64FDE0A324B925CF003D1B0D /* Rotor.hpp */, - 64FDE08924B8E42F003D1B0D /* main.cpp */, - 64FDE09024B8E48E003D1B0D /* EnigmaMachine.cpp */, - 64FDE09124B8E48E003D1B0D /* EnigmaMachine.hpp */, - 64FDE09724B8F57E003D1B0D /* RotorSet.cpp */, - 64FDE09824B8F57E003D1B0D /* RotorSet.hpp */, - 642ADE2E24B9C4F900C0A06A /* Reflector.cpp */, - 642ADE2F24B9C4F900C0A06A /* Reflector.hpp */, - 642ADE3124BA2C0900C0A06A /* EnigmaDecrypter.cpp */, - 642ADE3224BA2C0900C0A06A /* EnigmaDecrypter.hpp */, - 642ADE3424BA2FB900C0A06A /* RotorConfig.cpp */, - 642ADE3524BA2FB900C0A06A /* RotorConfig.hpp */, - ); - path = EnigmaMachine; - sourceTree = ""; - }; - 64FDE0A524B926DC003D1B0D /* Utils */ = { - isa = PBXGroup; - children = ( - 64FDE0A624B926DC003D1B0D /* config.h */, - 64FDE0A724B926DC003D1B0D /* utils.hpp */, - ); - path = Utils; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 64FDE08524B8E42F003D1B0D /* EnigmaMachine */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */; - buildPhases = ( - 64FDE08224B8E42F003D1B0D /* Sources */, - 64FDE08324B8E42F003D1B0D /* Frameworks */, - 64FDE08424B8E42F003D1B0D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = EnigmaMachine; - productName = EnigmaMachine; - productReference = 64FDE08624B8E42F003D1B0D /* EnigmaMachine */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 64FDE07E24B8E42F003D1B0D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Ayush Agrawal"; - TargetAttributes = { - 64FDE08524B8E42F003D1B0D = { - CreatedOnToolsVersion = 11.3; - }; - }; - }; - buildConfigurationList = 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 64FDE07D24B8E42F003D1B0D; - productRefGroup = 64FDE08724B8E42F003D1B0D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 64FDE08524B8E42F003D1B0D /* EnigmaMachine */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 64FDE08224B8E42F003D1B0D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 64FDE0A424B925CF003D1B0D /* Rotor.cpp in Sources */, - 642ADE3624BA2FB900C0A06A /* RotorConfig.cpp in Sources */, - 64FDE09224B8E48E003D1B0D /* EnigmaMachine.cpp in Sources */, - 642ADE3024B9C4F900C0A06A /* Reflector.cpp in Sources */, - 64FDE08A24B8E42F003D1B0D /* main.cpp in Sources */, - 64FDE09924B8F57E003D1B0D /* RotorSet.cpp in Sources */, - 642ADE3324BA2C0900C0A06A /* EnigmaDecrypter.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 64FDE08B24B8E42F003D1B0D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 64FDE08C24B8E42F003D1B0D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - }; - name = Release; - }; - 64FDE08E24B8E42F003D1B0D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 562SMMQ9U5; - ENABLE_HARDENED_RUNTIME = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 64FDE08F24B8E42F003D1B0D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 562SMMQ9U5; - ENABLE_HARDENED_RUNTIME = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 64FDE08124B8E42F003D1B0D /* Build configuration list for PBXProject "EnigmaMachine" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64FDE08B24B8E42F003D1B0D /* Debug */, - 64FDE08C24B8E42F003D1B0D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64FDE08D24B8E42F003D1B0D /* Build configuration list for PBXNativeTarget "EnigmaMachine" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 64FDE08E24B8E42F003D1B0D /* Debug */, - 64FDE08F24B8E42F003D1B0D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 64FDE07E24B8E42F003D1B0D /* Project object */; -} diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 94ff194..0000000 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate b/EnigmaMachine/EnigmaMachine.xcodeproj/project.xcworkspace/xcuserdata/ayushagrawal.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index bb18c0a26dd7c5557a11d42549f50541e93dd22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56443 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 - - - - - - - - diff --git a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist b/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index f43f716..0000000 --- a/EnigmaMachine/EnigmaMachine.xcodeproj/xcuserdata/ayushagrawal.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - EnigmaMachine.xcscheme_^#shared#^_ - - orderHint - 0 - - - - From 3e200c5b61119dd11fb09481c7cab1539a9ac66b Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sun, 12 Jul 2020 00:12:14 +0530 Subject: [PATCH 13/16] Fixed eclipse gitignore --- .cproject | 927 ------------------ .project | 71 -- .../org.eclipse.cdt.managedbuilder.core.prefs | 26 - 3 files changed, 1024 deletions(-) delete mode 100644 .cproject delete mode 100644 .project delete mode 100644 .settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/.cproject b/.cproject deleted file mode 100644 index 5e0c132..0000000 --- a/.cproject +++ /dev/null @@ -1,927 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index ec53fe2..0000000 --- a/.project +++ /dev/null @@ -1,71 +0,0 @@ - - - EnigmaSim - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - ?name? - - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.buildArguments - - - - org.eclipse.cdt.make.core.buildCommand - make - - - org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/EnigmaSim/Debug} - - - org.eclipse.cdt.make.core.contents - org.eclipse.cdt.make.core.activeConfigSettings - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - true - - - org.eclipse.cdt.make.core.enableFullBuild - true - - - org.eclipse.cdt.make.core.stopOnError - true - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs deleted file mode 100644 index d4cc1e6..0000000 --- a/.settings/org.eclipse.cdt.managedbuilder.core.prefs +++ /dev/null @@ -1,26 +0,0 @@ -#Sat Jul 11 20:12:08 IST 2020 -eclipse.preferences.version=1 -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/CPLUS_INCLUDE_PATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/C_INCLUDE_PATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/CPLUS_INCLUDE_PATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/delimiter=; -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/C_INCLUDE_PATH/operation=remove -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true -environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/delimiter=; -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/LIBRARY_PATH/operation=remove -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/append=true -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1001932859/appendContributed=true -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/delimiter=; -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/LIBRARY_PATH/operation=remove -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/append=true -environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1101643224/appendContributed=true From 5e5d49765d0e862d7dd6938ade4829526139098b Mon Sep 17 00:00:00 2001 From: Ayush Agrawal Date: Sun, 12 Jul 2020 00:16:28 +0530 Subject: [PATCH 14/16] Added all .DS_Store to gitignore --- .DS_Store | Bin 6148 -> 0 bytes EnigmaMachine/.DS_Store | Bin 6148 -> 0 bytes EnigmaMachine/EnigmaMachine/.DS_Store | Bin 6148 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 EnigmaMachine/.DS_Store delete mode 100644 EnigmaMachine/EnigmaMachine/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 844dc258345c34f413d260946bb7491ff1b11e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr=55Ukb>B#4ls$N2)mKNv!C^pqcnCNT9v!tXtLQtg|~-`N7@JzEtvJU%@~y5DWwZf06;c zc__mh!x)2sU?3PcF`(x|qAF&`Vpxw34z&d!HZ)h^Tzd)4NsigE7}7%#OC?&Wc#9#H zPJ8mW>{tvf9pcT0_>+&#i`1vHeyZV+Y#3uO5Dat~xVGh3@BbM;ncgP9n-Z&FAQ<>( z3`jGbPbYjSzgxe(p5C>Ix}d6PT+s=I^UhBI7kZA|Rj2ur&KZ{-i=kFgdrc?Ck3c0P KhG5_f4157{_Aws- diff --git a/EnigmaMachine/.DS_Store b/EnigmaMachine/.DS_Store deleted file mode 100644 index 842d887a3327bee7b43f7ff465aaa17274c2f53a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5S^_-A|mu;Jnk0={exK2o1S{{BGfdstt4(x1dsU$e@OpB@Kb!VJBF6D zf;~u)8JK;W$;>4CHtb}G$PAy00a2fbVkl$p2*U>9`>Y-5iRBPze2$84=?XffMaNqW z`^W(A-3g88ftEC<)%{z-HY=W{W$s*w?fuE^4u0Qm$@Xk?PA~X292GR9njSH`FXw~t z)K#@7$0TpSUuLLWmgS|(5g9kHmmkT^`^7Fw+U@F)I#2ttUp}-Jo zq{T2H9Cj;ysbCW@gp-lx!^o43bSTC@9r>+yCzA%$Q5jGM))_bmmwm4PqwW3wdXQcz z1Ioa^V!%Y%I2&R~Qd>KV<63K>6DSM&H38cYOnfPZFPGvos2A8RPk^al6A%`N{s?#) KbWjHVlz}e<+*SJk diff --git a/EnigmaMachine/EnigmaMachine/.DS_Store b/EnigmaMachine/EnigmaMachine/.DS_Store deleted file mode 100644 index 6c26ee13d6abf4f004b613af1d28df572fcccd19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~JqiLr422VaK(Mj2oW=uqgF*BJVlOI!AXupV9Nm{61XpVjd4c53WD;e+VrL^F zy0{VnwOF)Yypf$CHA_LQCg+{CT z7-D&EhnB3XsVy|xMRWMj{AaZ(2By(2TCjm>bzvX@66g@<$9`h>{|f$T{_nJKO9CYD zX9RSxTrU@RsJvU>9?$aI%-Xuap Date: Sun, 12 Jul 2020 17:05:48 +0530 Subject: [PATCH 15/16] Cracks rotor Offsets --- .cproject | 109 ++++++++++++++++++ .project | 27 +++++ .settings/language.settings.xml | 25 ++++ .../org.eclipse.cdt.managedbuilder.core.prefs | 13 +++ .../EnigmaMachine/EnigmaDecrypter.cpp | 42 ++++++- .../EnigmaMachine/EnigmaDecrypter.hpp | 10 +- EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp | 11 +- EnigmaMachine/EnigmaMachine/EnigmaMachine.hpp | 5 + EnigmaMachine/EnigmaMachine/RotorConfig.cpp | 17 +++ EnigmaMachine/EnigmaMachine/RotorConfig.hpp | 2 + EnigmaMachine/EnigmaMachine/RotorSet.cpp | 18 ++- EnigmaMachine/EnigmaMachine/RotorSet.hpp | 2 +- EnigmaMachine/EnigmaMachine/main.cpp | 9 +- 13 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 .cproject create mode 100644 .project create mode 100644 .settings/language.settings.xml create mode 100644 .settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..3068143 --- /dev/null +++ b/.cproject @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..002dab6 --- /dev/null +++ b/.project @@ -0,0 +1,27 @@ + + + Enigma-Simulator + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml new file mode 100644 index 0000000..c4cae33 --- /dev/null +++ b/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..55778d9 --- /dev/null +++ b/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/CPATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/CPATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/CPLUS_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/CPLUS_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/append=true +environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/appendContributed=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/append=true +environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.1340108827/appendContributed=true diff --git a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp index bbf8e11..e8383b4 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp @@ -2,8 +2,46 @@ // EnigmaDecrypter.cpp // EnigmaMachine // -// Created by Ayush Agrawal on 11/07/20. -// Copyright © 2020 Ayush Agrawal. All rights reserved. +// Created by Rajat Agarwal on 12/07/20. +// Copyright © 2020 Rajat Agarwal. All rights reserved. // #include "EnigmaDecrypter.hpp" +#include +#include "Utils/config.h" +#include + +EnigmaDecrypter::EnigmaDecrypter() { } + + +bool EnigmaDecrypter::offsetIterator(){ + for(int i = 0; i<26; i++){ + for(int j = 0; j<26; j++){ + for(int k = 0; k<26; k++){ + int arr[]={k, j, i}; + _enigmaMachine.setRotorOffset(arr); + std::string decoded = _enigmaMachine.encode(_crib); + if(decoded == _plaintxt){ + _config.offsets[0]=k; + _config.offsets[1]=j; + _config.offsets[2]=i; + return true; + } + } + } + } + return false; +} + + +bool EnigmaDecrypter::run(std::string crib, std::string plaintxt){ + crib = custom_utils::removeSpecial(crib); + _crib = custom_utils::toUppercase(crib); + plaintxt = custom_utils::removeSpecial(plaintxt); + _plaintxt = custom_utils::toUppercase(plaintxt); + return offsetIterator(); +} + +RotorConfig EnigmaDecrypter::getRotorConfig(){ + return _config; +} diff --git a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp index deb53b5..ba51923 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.hpp @@ -16,12 +16,16 @@ class EnigmaDecrypter { EnigmaMachine _enigmaMachine; RotorConfig _config; bool _keyFound; + std::string _crib; + std::string _plaintxt; + bool offsetIterator(); + public: EnigmaDecrypter(); - void offsetIterator(); void rotorTypeIterator(); void reflectorIterator(); - bool run(); - std::string decrypt(std::string inp); + RotorConfig getRotorConfig(); + std::string decrypt(); + bool run(std::string crib, std::string plaintxt); }; diff --git a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp index 2adbb53..1d89ac6 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaMachine.cpp @@ -8,9 +8,11 @@ #include "EnigmaMachine.hpp" #include "Utils/utils.hpp" - +#include "RotorConfig.hpp" EnigmaMachine::EnigmaMachine(RotorConfig r_config): _rotorSet(r_config) { } +EnigmaMachine::EnigmaMachine() { } + std::string EnigmaMachine::encode(std::string inputStr){ std::string inpCopy = custom_utils::removeSpecial(inputStr); @@ -24,3 +26,10 @@ std::string EnigmaMachine::encode(std::string inputStr){ return outputStr; } + + +void EnigmaMachine::setRotorOffset(int offsets[NO_OF_ROTORS]){ + for(int i = 0; i RotorSet::RotorSet(RotorConfig r_config): _config(r_config) { for (int i = 0; i < NO_OF_ROTORS; i++){ _rotors[i] = new Rotor ( _config.types[i], _config.offsets[i] ); @@ -80,3 +80,19 @@ void RotorSet::randomConfig(){ type = rand() % NO_REFLECTOR_TYPES; setReflectorType(type); } + + +RotorSet::RotorSet() { + for (int i = 0; i < NO_OF_ROTORS; i++){ + _rotors[i] = new Rotor ( _config.types[i], _config.offsets[i] ); + } + _reflector = new Reflector ( _config.reflectorType ); + + for (int i = 0; i < NO_OF_ROTORS - 1; i++){ + _rotors[i]->nextRot = _rotors[i+1]; + _rotors[i+1]->prevRot = _rotors[i]; + } + + _rotors[NO_OF_ROTORS - 1]->nextRot = _reflector; + _reflector->nextRot = _rotors[NO_OF_ROTORS - 1]; +} diff --git a/EnigmaMachine/EnigmaMachine/RotorSet.hpp b/EnigmaMachine/EnigmaMachine/RotorSet.hpp index 40f1f72..aaf276f 100644 --- a/EnigmaMachine/EnigmaMachine/RotorSet.hpp +++ b/EnigmaMachine/EnigmaMachine/RotorSet.hpp @@ -29,7 +29,7 @@ class RotorSet { RotorSet(RotorConfig r_config); ~RotorSet(); int parseValue(char input); - + RotorSet(); void setRotorOffset(int rotPos, int offset); void setRotorType(int rotPos, int type); void setReflectorType(int type); diff --git a/EnigmaMachine/EnigmaMachine/main.cpp b/EnigmaMachine/EnigmaMachine/main.cpp index 9f0832c..7bd9f52 100644 --- a/EnigmaMachine/EnigmaMachine/main.cpp +++ b/EnigmaMachine/EnigmaMachine/main.cpp @@ -14,7 +14,7 @@ #include "EnigmaMachine.hpp" #include "Utils/config.h" #include "RotorConfig.hpp" - +#include "EnigmaDecrypter.hpp" int main(int argc, const char * argv[]) { int rotorNumbers[NO_OF_ROTORS] = {ROTOR_1, ROTOR_2, ROTOR_3}; @@ -41,4 +41,11 @@ int main(int argc, const char * argv[]) { std::cout << encoded << "\n"; std::cout << enigmaMachine2.encode(encoded) << "\n"; + EnigmaDecrypter enigmaDecrypter; + enigmaDecrypter.run(encoded, message); + RotorConfig dConfig=enigmaDecrypter.getRotorConfig(); + for(int i = 0;i Date: Wed, 30 Sep 2020 21:55:22 +0530 Subject: [PATCH 16/16] commmit --- .../EnigmaMachine/EnigmaDecrypter.cpp | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp index e8383b4..1e86b0e 100644 --- a/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp +++ b/EnigmaMachine/EnigmaMachine/EnigmaDecrypter.cpp @@ -14,7 +14,7 @@ EnigmaDecrypter::EnigmaDecrypter() { } -bool EnigmaDecrypter::offsetIterator(){ +/*bool EnigmaDecrypter::offsetIterator(){ for(int i = 0; i<26; i++){ for(int j = 0; j<26; j++){ for(int k = 0; k<26; k++){ @@ -32,7 +32,26 @@ bool EnigmaDecrypter::offsetIterator(){ } return false; } +*/ +bool EnigmaDecrypter::offsetIterator(){ + for(int i = 0; i<26; i++){ + for(int j = 0; j<26; j++){ + for(int k = 0; k<26; k++){ + int arr[]={k, j, i}; + _enigmaMachine.setRotorOffset(arr); + std::string decoded = _enigmaMachine.encode(_crib); + if(decoded == _plaintxt){ + _config.offsets[0]=k; + _config.offsets[1]=j; + _config.offsets[2]=i; + return true; + } + } + } + } + return false; +} bool EnigmaDecrypter::run(std::string crib, std::string plaintxt){ crib = custom_utils::removeSpecial(crib);