|
| 1 | +package S_DES |
| 2 | + |
| 3 | +import ( |
| 4 | + "io" |
| 5 | + "log" |
| 6 | + "os" |
| 7 | +) |
| 8 | + |
| 9 | +const ( |
| 10 | + bufferSize = 1000000 |
| 11 | +) |
| 12 | + |
| 13 | +type DesEncryptor struct { |
| 14 | + filename string |
| 15 | + encryptionFilename string |
| 16 | + cipher DES_8encryption |
| 17 | + decryptionFileConnector *os.File |
| 18 | + decryptionFilename string |
| 19 | +} |
| 20 | + |
| 21 | +func (encryptor *DesEncryptor) getBinaryByteArray(byteVal byte) []byte { |
| 22 | + var byteArray []byte |
| 23 | + for byteVal > 0 { |
| 24 | + // byteArray = append([]byte{(byte)(byteVal % 2)}, byteArray...) |
| 25 | + byteArray = append(byteArray, (byte)(byteVal%2)) |
| 26 | + byteVal /= 2 |
| 27 | + } |
| 28 | + for (int)(len(byteArray)) < 8 { |
| 29 | + // byteArray = append([]byte{0}, byteArray...) |
| 30 | + byteArray = append(byteArray, (byte)(0)) |
| 31 | + } |
| 32 | + |
| 33 | + return byteArray |
| 34 | +} |
| 35 | + |
| 36 | +func (encryptor *DesEncryptor) convertBinaryByteArrayToByte(byteArray *[]byte) byte { |
| 37 | + var res byte = 0 |
| 38 | + for i := len(*byteArray) - 1; i >= 0; i-- { |
| 39 | + if (*byteArray)[i] == (byte)(1) { |
| 40 | + res |= (1 << i) |
| 41 | + } else { |
| 42 | + mask := ^(1 << i) |
| 43 | + res &= (byte)(mask) |
| 44 | + } |
| 45 | + } |
| 46 | + |
| 47 | + return res |
| 48 | +} |
| 49 | + |
| 50 | +func (encryptor *DesEncryptor) encryptChunk(buffer *[]byte, bufferDataSize int, encryptionBuffer *[][]byte) { |
| 51 | + for i := 0; i < bufferDataSize; i++ { |
| 52 | + byteVal := (*buffer)[i] |
| 53 | + var binaryByteArray []byte = encryptor.getBinaryByteArray(byteVal) |
| 54 | + (*encryptionBuffer)[i] = encryptor.cipher.Encrypt(binaryByteArray) |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +func (engine *DesEncryptor) decryptChunk(buffer *[]byte, bufferDataSize int, decryptionBuffer *[][]byte) { |
| 59 | + for i := 0; i < bufferDataSize; i++ { |
| 60 | + byteVal := (*buffer)[i] |
| 61 | + var binaryByteArray []byte = engine.getBinaryByteArray(byteVal) |
| 62 | + (*decryptionBuffer)[i] = engine.cipher.Decrypt(binaryByteArray) |
| 63 | + } |
| 64 | +} |
| 65 | + |
| 66 | +func (encryptor *DesEncryptor) writeEncryptionBufferToFile(encryptionBuffer *[][]byte, |
| 67 | + encryptionDataSize int, |
| 68 | + filename string) { |
| 69 | + // var byteVal byte |
| 70 | + // fmt.Println("enccryption buffer length:", encryptionDataSize) |
| 71 | + var byteArray []byte = make([]byte, encryptionDataSize) |
| 72 | + var cache []byte = make([]byte, 8) |
| 73 | + for i := 0; i < encryptionDataSize; i++ { |
| 74 | + copy(cache[:], (*encryptionBuffer)[i][:]) |
| 75 | + byteVal := encryptor.convertBinaryByteArrayToByte(&cache) |
| 76 | + byteArray[i] = byteVal |
| 77 | + } |
| 78 | + |
| 79 | + _, err := os.Stat(filename) |
| 80 | + if os.IsNotExist(err) { |
| 81 | + _, ferr := os.Create(filename) |
| 82 | + if ferr != nil { |
| 83 | + log.Fatalln("Problem encrypting file", ferr) |
| 84 | + } |
| 85 | + } |
| 86 | + // write byte array to buffer |
| 87 | + permissions := 0644 |
| 88 | + file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, (os.FileMode)(permissions)) |
| 89 | + if err != nil { |
| 90 | + log.Fatalln("Problem encrypting file", err) |
| 91 | + } |
| 92 | + _, err = file.WriteString((string)(byteArray)) |
| 93 | + |
| 94 | + file.Close() |
| 95 | +} |
| 96 | + |
| 97 | +func (engine *DesEncryptor) writeDecryptionBufferToFile(decryptionBuffer *[][]byte, |
| 98 | + decryptionDataSize int, |
| 99 | + filename string) { |
| 100 | + |
| 101 | + // fmt.Println("Decryption buffer length:", decryptionDataSize) |
| 102 | + var byteArray []byte = make([]byte, decryptionDataSize) |
| 103 | + var cache []byte = make([]byte, 8) |
| 104 | + for i := 0; i < decryptionDataSize; i++ { |
| 105 | + copy(cache[:], (*decryptionBuffer)[i][:]) |
| 106 | + byteVal := engine.convertBinaryByteArrayToByte(&cache) |
| 107 | + byteArray[i] = byteVal |
| 108 | + } |
| 109 | + |
| 110 | + _, err := engine.decryptionFileConnector.WriteString((string)(byteArray)) |
| 111 | + if err != nil { |
| 112 | + log.Fatalln("Problem decrypting file", err) |
| 113 | + } |
| 114 | +} |
| 115 | + |
| 116 | +/** |
| 117 | +Reads in a chunk of byte-data from file. |
| 118 | +Encrypts it. |
| 119 | +Writes the encrypted chunk of data in the encryption file |
| 120 | +*/ |
| 121 | +func (encryptor *DesEncryptor) runEncryption(filename string) { |
| 122 | + |
| 123 | + file, err := os.Open(filename) |
| 124 | + if err != nil { |
| 125 | + log.Fatalln("Problem encrypting file", err) |
| 126 | + return |
| 127 | + } |
| 128 | + defer file.Close() |
| 129 | + |
| 130 | + // Create encryption file |
| 131 | + _, err = os.Create(encryptor.encryptionFilename) |
| 132 | + if err != nil { |
| 133 | + log.Fatalln("Problem encrypting file", err) |
| 134 | + } |
| 135 | + |
| 136 | + var buffer []byte |
| 137 | + buffer = make([]byte, bufferSize) |
| 138 | + var encryptionBuffer [][]byte |
| 139 | + encryptionBuffer = make([][]byte, bufferSize) |
| 140 | + for i := 0; i < bufferSize; i++ { |
| 141 | + encryptionBuffer[i] = make([]byte, 8) |
| 142 | + } |
| 143 | + |
| 144 | + for { |
| 145 | + bytesread, err := file.Read(buffer) |
| 146 | + if err != nil { |
| 147 | + if err != io.EOF { |
| 148 | + log.Fatalln("Problem while reading the contents of the file.") |
| 149 | + } |
| 150 | + break |
| 151 | + } |
| 152 | + |
| 153 | + encryptor.encryptChunk(&buffer, bytesread, &encryptionBuffer) |
| 154 | + // Write encryptionBuffer into file. |
| 155 | + encryptor.writeEncryptionBufferToFile(&encryptionBuffer, bytesread, encryptor.encryptionFilename) |
| 156 | + |
| 157 | + // fmt.Println("bytesread:", bytesread, "bytes to string:", string(buffer[:bytesread])) |
| 158 | + } |
| 159 | +} |
| 160 | + |
| 161 | +/** |
| 162 | +Decrypt the bytes of the encrypted file |
| 163 | +*/ |
| 164 | +func (engine *DesEncryptor) runDecryption(filename string) { |
| 165 | + var buffer []byte = make([]byte, bufferSize) |
| 166 | + var decryptionBuffer [][]byte = make([][]byte, bufferSize) |
| 167 | + for i := 0; i < bufferSize; i++ { |
| 168 | + decryptionBuffer[i] = make([]byte, 8) |
| 169 | + } |
| 170 | + |
| 171 | + // fmt.Println("Encryption filename:", engine.encryptionFilename) |
| 172 | + file, ferr := os.Open(engine.encryptionFilename) |
| 173 | + if ferr != nil { |
| 174 | + log.Fatalln("Problem opening encrypted file...Filename:", engine.encryptionFilename, ferr) |
| 175 | + } |
| 176 | + for { |
| 177 | + bytesread, err := file.Read(buffer) |
| 178 | + if err != nil { |
| 179 | + if err != io.EOF { |
| 180 | + log.Fatalln("Problem reading encrypted file", err) |
| 181 | + } |
| 182 | + break |
| 183 | + } |
| 184 | + engine.decryptChunk(&buffer, bytesread, &decryptionBuffer) |
| 185 | + // Write decryptionBuffer into file |
| 186 | + engine.writeDecryptionBufferToFile(&decryptionBuffer, bytesread, engine.decryptionFilename) |
| 187 | + |
| 188 | + // fmt.Println("Decryption, bytesread:", bytesread, " bytes to string:", string(buffer[:bytesread])) |
| 189 | + } |
| 190 | +} |
| 191 | + |
| 192 | +/** |
| 193 | +public File-encryption API |
| 194 | +*/ |
| 195 | +func (encryptor *DesEncryptor) EncryptFile(filename string) { |
| 196 | + log.Println("File-Encryption procedure started...") |
| 197 | + |
| 198 | + encryptor.filename = filename |
| 199 | + encryptor.encryptionFilename = filename + ".enc" |
| 200 | + // encryptor.cipher.Init("des_input.txt") |
| 201 | + encryptor.runEncryption(filename) |
| 202 | + |
| 203 | + log.Println("File-Encryption procedure complete...") |
| 204 | +} |
| 205 | + |
| 206 | +/** |
| 207 | +Public Decryption API |
| 208 | +*/ |
| 209 | +func (engine *DesEncryptor) DecryptFile(filename string) { |
| 210 | + log.Println("Decryption procedure started...") |
| 211 | + |
| 212 | + engine.decryptionFilename = "dec." + filename |
| 213 | + engine.encryptionFilename = filename + ".enc" |
| 214 | + var err error |
| 215 | + engine.decryptionFileConnector, err = os.Create(engine.decryptionFilename) |
| 216 | + if err != nil { |
| 217 | + log.Fatalln("Problem decrypting the file", err) |
| 218 | + } |
| 219 | + permissions := 0644 |
| 220 | + engine.decryptionFileConnector, err = |
| 221 | + os.OpenFile(engine.decryptionFilename, os.O_APPEND|os.O_WRONLY, (os.FileMode)(permissions)) |
| 222 | + // file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, (os.FileMode)(permissions)) |
| 223 | + // engine.cipher.Init("des_input.txt") |
| 224 | + engine.runDecryption(filename) |
| 225 | + engine.decryptionFileConnector.Close() |
| 226 | + |
| 227 | + log.Println("Decryption procedure complete...") |
| 228 | +} |
| 229 | + |
| 230 | +func (engine *DesEncryptor) Init(filename string) { |
| 231 | + log.Println("Initializing FES engine...") |
| 232 | + engine.cipher.Init(filename) |
| 233 | + log.Println("FES engine intialization complete...") |
| 234 | +} |
0 commit comments