• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • A Simple Encryption/Decryption Algorithm for Numbers

    April 27, 2005 Hey, Ted

    One of the most important tasks of any IT department is to make sure that information stored in database files is not accessible to unauthorized users. RPG program CCED01 provides a simple way to encrypt and decrypt numbers up to 16 digits long.

    The algorithm is based on a16-element array of numeric digits, which I implement as a compile-time array in CCED01. Each element must contain the ten numeric characters from 0 to 9. Each digit must appear only once in each element of the array. The digits can appear in any order you like. Here’s an example:

    0123456789
    1234567890
    2345678901
    3456789012
    4567890123
    5678901234
    6789012345
    7890123456
    8901234567
    9012345678
    0123456789
    1234567890
    2345678901
    3456789012
    4567890123
    5678901234
    

    Program CCED01 has only one parameter: a 17-byte character value. The first 16 bytes contain a left-justified number. The last byte must contain E to encrypt or D to decrypt.

    Let’s consider an example. Suppose a social security number 328827109 has to be stored in a database file. This number is passed to the program with the right justified letter ‘E’ for encryption:

    CALL PGM (CCED01) PARM ('328827109       E')
    

    Encryption is a two-step process. In the first step, the program replaces each digit of the number by its position within its array element, as illustrated here.

    Input number

    Array element

    Output number

    3

    0 1 2 3 4 5 6 7 8 9

    4

    2

    1 2 3 4 5 6 7 8 9 0

    2

    8

    2 3 4 5 6 7 8 9 0 1

    7

    8

    3 4 5 6 7 8 9 0 1 2

    6

    2

    4 5 6 7 8 9 0 1 2 3

    9

    7

    5 6 7 8 9 0 1 2 3 4

    3

    1

    6 7 8 9 0 1 2 3 4 5

    6

    0

    7 8 9 0 1 2 3 4 5 6

    4

    9

    8 9 0 1 2 3 4 5 6 7

    2

     

    9 0 1 2 3 4 5 6 7 8

     

     

    0 1 2 3 4 5 6 7 8 9

     

     

    1 2 3 4 5 6 7 8 9 0

     

     

    2 3 4 5 6 7 8 9 0 1

     

     

    3 4 5 6 7 8 9 0 1 2

     

     

    4 5 6 7 8 9 0 1 2 3

     

     

    5 6 7 8 9 0 1 2 3 4

     

    The second step is to translate the resulting digit character to “garbage” characters. In my implementation, I translate the digits 0 through 9 to the values !@#$% &*(), which are the characters produced by holding down the shift key and pressing the number keys across the top of the keyboard.

    Original Social Security Number:                       3 2 8 8 2 7 1 0 9

    Numerically Encrypted Number:                        4 2 7 6 9 3 6 4 2

    “Garbage” Characters Encrypted Number:      % # * & ) $ & % #

    The returned value %#*&)$&%# will be stored in the database file.

    To decrypt the value, in order to display it on a screen for instance, I call the same program, passing the encrypted value as the left-justified portion of the parameter and the right-justified letter ‘D’ for decryption:

    CALL PGM (CCED01) PARM (' %#*&)$&%#       D')
    

    The returned value 328827109 will be displayed on the screen.

    Two organizations can use the same algorithm by using program CCED01with different compile time arrays, having different combinations of digits from 0 to 9 within the corresponding rows of the table. This difference in translation tables makes the encryption/decryption algorithm unique for each organization.

    –Victor Pisman


    Thanks to Victor for this interesting little algorithm. Let me add a few comments.

    First, this is not industrial-strength encryption. One problem with this algorithm is that there is no way to change the encryption/decryption key without decrypting all encrypted data with the old array and re-encrypting it with a new compile-time array. However, it should be adequate for curious eyes around the office, especially those with access to query and reporting tools.

    Second, Victor has allowed for 16 digits. This program could easily be modified to handle larger numbers.

    Last, Victor’s use of one parameter works fine, but anyone who decides to implement this program might find it advantageous to use two or three parameters instead. I would prefer that the D or E option have its own parameter. It might also be good to have separate parameters for the encrypted and decrypted values.

    –Ted

    Share this:

    • Share on Reddit (Opens in new window) Reddit
    • Share on Facebook (Opens in new window) Facebook
    • Share on LinkedIn (Opens in new window) LinkedIn
    • Share on X (Opens in new window) X
    • Email a link to a friend (Opens in new window) Email

    Tags:

    Sponsored by
    New Generation Software, Inc.

    It’s Time!
    Replace IBM Query/400 and DB2 Web Query with NGS-IQ.

    IBM retired Query/400 and DB2 Web Query long ago. Is your company still at the party?
    Don’t keep your users waiting.

    Watch a demo on demand and see how NGS-IQ can save you time creating and updating ad-hoc queries; production reports; Excel sheets, tables, and ranges; Adobe PDF files; Web reports; and multidimensional models.

    www.ngsi.com – 800-824-1220

    Share this:

    • Share on Reddit (Opens in new window) Reddit
    • Share on Facebook (Opens in new window) Facebook
    • Share on LinkedIn (Opens in new window) LinkedIn
    • Share on X (Opens in new window) X
    • Email a link to a friend (Opens in new window) Email

    All You Need for B2B is GIS 4.0, Sterling Says Suppress Runtime Display When Qshell Cancels

    Leave a ReplyCancel reply

Volume 5, Number 17 -- April 27, 2005
THIS ISSUE
SPONSORED BY:

WorksRight Software
Advanced Systems Concepts
Guild Companies
SoftLanding Systems

Table of Contents

  • A Simple Encryption/Decryption Algorithm for Numbers
  • Suppress Runtime Display When Qshell Cancels
  • Admin Alert: Getting Ready for Single Sign-On

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • Inside The Encryption Key Management Changes In IBM i 7.6
  • FalconStor Moved To The Blue Lagoon, And Is Poised For Growth Because Of It
  • Guru: Claude’s SQL Tip
  • Astera Makes Extracting Legacy Report Data an AI Specialty
  • IBM i PTF Guide, Volume 28, Number 27
  • Welcoming The New IBM i Chief Architect And Other New Top Brass
  • A Deep Dive Into That Power S1112 Entry Power11 Server
  • Guru: Beyond Three-Part Naming – Running SQL Across Remote IBM i Systems
  • How IBM Bolstered IBM i Resilience In The Summer Tech Refreshes
  • IBM i PTF Guide, Volume 28, Number 26

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle