Yeah, there are a lot of players determining how your keys are interpreted. If it's a remote system you're connecting to then PuTTY or whatever your terminal emulator is is a likely bottleneck---that is, if it's sending the same data for up and control-up, nothing you do downstream can recover the difference. This is true for each of the players, but I know most of the others to be configurable. I don't know how configurable your terminal emulator is. Some will, even if they're capable of seeing a difference between up and control-up, still send the same data to the processes they're connected to.
Are you running PuTTYTel in Windows? Then someone else will have to help you figure out how to get PuTTYTel to detect the difference between up and control-up, and send different data for each. I only know *nix.
What key is sent by return and by delete and so on are determined by what TERM your terminal emulator is set to be using. You should be able to use anything that you have a terminfo file for at the other end. On my machine, the terminfo file for vt100 says return should be a ^M, though, not a ^J. (Backspace in vt100 is ^H.) So I don't know how much you're going to be able to rely on this terminal emulator...
Backspace is also ^H in xterm. In other terminfo definitions it's ^?, that is 0x7f. For instance, that's true on the "linux" and "rxvt-unicode" terminfo definitions.