#CJam, 90 bytes This is just a straight forward implementation. This can be golfed a lot using base conversion though.. "~`!@#$%^&*()_-+=\|"A,s+"qwertyuiop[]{}""asdfghjkl;':\"""zxcvbnm,./<>?"]_:eu.+qf&{},{,}$0= [Try it online here][1] [1]: http://cjam.aditsu.net/#code=%22~%60!%40%23%24%25%5E%26*()_-%2B%3D%5C%7C%22A%2Cs%2B%22qwertyuiop%5B%5D%7B%7D%22%22asdfghjkl%3B'%3A%5C%22%22%22zxcvbnm%2C.%2F%3C%3E%3F%22%5D_%3Aeu.%2Bqf%26%7B%7D%2C%7B%2C%7D%240%3D&input=lkjrhsDdftkjhrksRjd